Check-in [4ee9e31a2d]
Not logged in
Overview

SHA1 Hash:4ee9e31a2d890bcaf5e36bf300983d9797ab6507
Date: 2008-02-13 15:04:49
User: drh
Comment:Add the TH1 code to the source tree and makefile. But do not yet make any calls to TH1.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified src/main.mk from [3a3bee5aa8] to [e9b2daa7c6].

@@ -222,12 +222,12 @@
 VERSION.h:	$(SRCDIR)/../manifest.uuid $(SRCDIR)/../manifest
 	awk '{ printf "#define MANIFEST_UUID \"%s\"\n", $$1}'  $(SRCDIR)/../manifest.uuid >VERSION.h
 	awk '{ printf "#define MANIFEST_VERSION \"[%.10s]\"\n", $$1}'  $(SRCDIR)/../manifest.uuid >>VERSION.h
 	awk '$$1=="D"{printf "#define MANIFEST_DATE \"%s %s\"\n", substr($$2,1,10),substr($$2,12)}'  $(SRCDIR)/../manifest >>VERSION.h
 
-$(APPNAME):	headers $(OBJ) sqlite3.o
-	$(TCC) -o $(APPNAME) $(OBJ) sqlite3.o $(LIB)
+$(APPNAME):	headers $(OBJ) sqlite3.o th.o th_lang.o
+	$(TCC) -o $(APPNAME) $(OBJ) sqlite3.o th.o th_lang.o $(LIB)
 
 # This rule prevents make from using its default rules to try build
 # an executable named "manifest" out of the file named "manifest.c"
 #
 $(SRCDIR)/../manifest:
@@ -237,11 +237,11 @@
 	rm -f *.o *_.c $(APPNAME) VERSION.h
 	rm -f translate makeheaders mkindex page_index.h headers
 	rm -f add.h admin.h bag.h blob.h branch.h browse.h cgi.h checkin.h checkout.h clearsign.h clone.h comformat.h construct.h content.h db.h delta.h deltacmd.h descendents.h diff.h diffcmd.h encode.h file.h http.h info.h login.h main.h manifest.h md5.h merge.h merge3.h my_page.h name.h pivot.h pqueue.h printf.h rebuild.h rss.h schema.h setup.h sha1.h style.h subscript.h sync.h tag.h tagview.h timeline.h tkt.h tktconfig.h tktsetup.h undo.h update.h url.h user.h verify.h vfile.h wiki.h wikiformat.h xfer.h zip.h
 
 headers:	makeheaders mkindex $(TRANS_SRC) ./VERSION.h
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	./mkindex $(TRANS_SRC) >page_index.h
 	touch headers
 
 add_.c:	$(SRCDIR)/add.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/add.c | sed -f $(SRCDIR)/VERSION >add_.c
@@ -248,591 +248,597 @@
 
 add.o:	add_.c add.h  $(SRCDIR)/config.h
 	$(XTCC) -o add.o -c add_.c
 
 add.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 admin_.c:	$(SRCDIR)/admin.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/admin.c | sed -f $(SRCDIR)/VERSION >admin_.c
 
 admin.o:	admin_.c admin.h  $(SRCDIR)/config.h
 	$(XTCC) -o admin.o -c admin_.c
 
 admin.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 bag_.c:	$(SRCDIR)/bag.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/bag.c | sed -f $(SRCDIR)/VERSION >bag_.c
 
 bag.o:	bag_.c bag.h  $(SRCDIR)/config.h
 	$(XTCC) -o bag.o -c bag_.c
 
 bag.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 blob_.c:	$(SRCDIR)/blob.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/blob.c | sed -f $(SRCDIR)/VERSION >blob_.c
 
 blob.o:	blob_.c blob.h  $(SRCDIR)/config.h
 	$(XTCC) -o blob.o -c blob_.c
 
 blob.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 branch_.c:	$(SRCDIR)/branch.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/branch.c | sed -f $(SRCDIR)/VERSION >branch_.c
 
 branch.o:	branch_.c branch.h  $(SRCDIR)/config.h
 	$(XTCC) -o branch.o -c branch_.c
 
 branch.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 browse_.c:	$(SRCDIR)/browse.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/browse.c | sed -f $(SRCDIR)/VERSION >browse_.c
 
 browse.o:	browse_.c browse.h  $(SRCDIR)/config.h
 	$(XTCC) -o browse.o -c browse_.c
 
 browse.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 cgi_.c:	$(SRCDIR)/cgi.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/cgi.c | sed -f $(SRCDIR)/VERSION >cgi_.c
 
 cgi.o:	cgi_.c cgi.h  $(SRCDIR)/config.h
 	$(XTCC) -o cgi.o -c cgi_.c
 
 cgi.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 checkin_.c:	$(SRCDIR)/checkin.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/checkin.c | sed -f $(SRCDIR)/VERSION >checkin_.c
 
 checkin.o:	checkin_.c checkin.h  $(SRCDIR)/config.h
 	$(XTCC) -o checkin.o -c checkin_.c
 
 checkin.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 checkout_.c:	$(SRCDIR)/checkout.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/checkout.c | sed -f $(SRCDIR)/VERSION >checkout_.c
 
 checkout.o:	checkout_.c checkout.h  $(SRCDIR)/config.h
 	$(XTCC) -o checkout.o -c checkout_.c
 
 checkout.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 clearsign_.c:	$(SRCDIR)/clearsign.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/clearsign.c | sed -f $(SRCDIR)/VERSION >clearsign_.c
 
 clearsign.o:	clearsign_.c clearsign.h  $(SRCDIR)/config.h
 	$(XTCC) -o clearsign.o -c clearsign_.c
 
 clearsign.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 clone_.c:	$(SRCDIR)/clone.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/clone.c | sed -f $(SRCDIR)/VERSION >clone_.c
 
 clone.o:	clone_.c clone.h  $(SRCDIR)/config.h
 	$(XTCC) -o clone.o -c clone_.c
 
 clone.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 comformat_.c:	$(SRCDIR)/comformat.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/comformat.c | sed -f $(SRCDIR)/VERSION >comformat_.c
 
 comformat.o:	comformat_.c comformat.h  $(SRCDIR)/config.h
 	$(XTCC) -o comformat.o -c comformat_.c
 
 comformat.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 construct_.c:	$(SRCDIR)/construct.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/construct.c | sed -f $(SRCDIR)/VERSION >construct_.c
 
 construct.o:	construct_.c construct.h  $(SRCDIR)/config.h
 	$(XTCC) -o construct.o -c construct_.c
 
 construct.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 content_.c:	$(SRCDIR)/content.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/content.c | sed -f $(SRCDIR)/VERSION >content_.c
 
 content.o:	content_.c content.h  $(SRCDIR)/config.h
 	$(XTCC) -o content.o -c content_.c
 
 content.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 db_.c:	$(SRCDIR)/db.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/db.c | sed -f $(SRCDIR)/VERSION >db_.c
 
 db.o:	db_.c db.h  $(SRCDIR)/config.h
 	$(XTCC) -o db.o -c db_.c
 
 db.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 delta_.c:	$(SRCDIR)/delta.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/delta.c | sed -f $(SRCDIR)/VERSION >delta_.c
 
 delta.o:	delta_.c delta.h  $(SRCDIR)/config.h
 	$(XTCC) -o delta.o -c delta_.c
 
 delta.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 deltacmd_.c:	$(SRCDIR)/deltacmd.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/deltacmd.c | sed -f $(SRCDIR)/VERSION >deltacmd_.c
 
 deltacmd.o:	deltacmd_.c deltacmd.h  $(SRCDIR)/config.h
 	$(XTCC) -o deltacmd.o -c deltacmd_.c
 
 deltacmd.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 descendents_.c:	$(SRCDIR)/descendents.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/descendents.c | sed -f $(SRCDIR)/VERSION >descendents_.c
 
 descendents.o:	descendents_.c descendents.h  $(SRCDIR)/config.h
 	$(XTCC) -o descendents.o -c descendents_.c
 
 descendents.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 diff_.c:	$(SRCDIR)/diff.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/diff.c | sed -f $(SRCDIR)/VERSION >diff_.c
 
 diff.o:	diff_.c diff.h  $(SRCDIR)/config.h
 	$(XTCC) -o diff.o -c diff_.c
 
 diff.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 diffcmd_.c:	$(SRCDIR)/diffcmd.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/diffcmd.c | sed -f $(SRCDIR)/VERSION >diffcmd_.c
 
 diffcmd.o:	diffcmd_.c diffcmd.h  $(SRCDIR)/config.h
 	$(XTCC) -o diffcmd.o -c diffcmd_.c
 
 diffcmd.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 encode_.c:	$(SRCDIR)/encode.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/encode.c | sed -f $(SRCDIR)/VERSION >encode_.c
 
 encode.o:	encode_.c encode.h  $(SRCDIR)/config.h
 	$(XTCC) -o encode.o -c encode_.c
 
 encode.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 file_.c:	$(SRCDIR)/file.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/file.c | sed -f $(SRCDIR)/VERSION >file_.c
 
 file.o:	file_.c file.h  $(SRCDIR)/config.h
 	$(XTCC) -o file.o -c file_.c
 
 file.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 http_.c:	$(SRCDIR)/http.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/http.c | sed -f $(SRCDIR)/VERSION >http_.c
 
 http.o:	http_.c http.h  $(SRCDIR)/config.h
 	$(XTCC) -o http.o -c http_.c
 
 http.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 info_.c:	$(SRCDIR)/info.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/info.c | sed -f $(SRCDIR)/VERSION >info_.c
 
 info.o:	info_.c info.h  $(SRCDIR)/config.h
 	$(XTCC) -o info.o -c info_.c
 
 info.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 login_.c:	$(SRCDIR)/login.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/login.c | sed -f $(SRCDIR)/VERSION >login_.c
 
 login.o:	login_.c login.h  $(SRCDIR)/config.h
 	$(XTCC) -o login.o -c login_.c
 
 login.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 main_.c:	$(SRCDIR)/main.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/main.c | sed -f $(SRCDIR)/VERSION >main_.c
 
 main.o:	main_.c main.h page_index.h $(SRCDIR)/config.h
 	$(XTCC) -o main.o -c main_.c
 
 main.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 manifest_.c:	$(SRCDIR)/manifest.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/manifest.c | sed -f $(SRCDIR)/VERSION >manifest_.c
 
 manifest.o:	manifest_.c manifest.h  $(SRCDIR)/config.h
 	$(XTCC) -o manifest.o -c manifest_.c
 
 manifest.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 md5_.c:	$(SRCDIR)/md5.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/md5.c | sed -f $(SRCDIR)/VERSION >md5_.c
 
 md5.o:	md5_.c md5.h  $(SRCDIR)/config.h
 	$(XTCC) -o md5.o -c md5_.c
 
 md5.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 merge_.c:	$(SRCDIR)/merge.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/merge.c | sed -f $(SRCDIR)/VERSION >merge_.c
 
 merge.o:	merge_.c merge.h  $(SRCDIR)/config.h
 	$(XTCC) -o merge.o -c merge_.c
 
 merge.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 merge3_.c:	$(SRCDIR)/merge3.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/merge3.c | sed -f $(SRCDIR)/VERSION >merge3_.c
 
 merge3.o:	merge3_.c merge3.h  $(SRCDIR)/config.h
 	$(XTCC) -o merge3.o -c merge3_.c
 
 merge3.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 my_page_.c:	$(SRCDIR)/my_page.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/my_page.c | sed -f $(SRCDIR)/VERSION >my_page_.c
 
 my_page.o:	my_page_.c my_page.h  $(SRCDIR)/config.h
 	$(XTCC) -o my_page.o -c my_page_.c
 
 my_page.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 name_.c:	$(SRCDIR)/name.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/name.c | sed -f $(SRCDIR)/VERSION >name_.c
 
 name.o:	name_.c name.h  $(SRCDIR)/config.h
 	$(XTCC) -o name.o -c name_.c
 
 name.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 pivot_.c:	$(SRCDIR)/pivot.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/pivot.c | sed -f $(SRCDIR)/VERSION >pivot_.c
 
 pivot.o:	pivot_.c pivot.h  $(SRCDIR)/config.h
 	$(XTCC) -o pivot.o -c pivot_.c
 
 pivot.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 pqueue_.c:	$(SRCDIR)/pqueue.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/pqueue.c | sed -f $(SRCDIR)/VERSION >pqueue_.c
 
 pqueue.o:	pqueue_.c pqueue.h  $(SRCDIR)/config.h
 	$(XTCC) -o pqueue.o -c pqueue_.c
 
 pqueue.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 printf_.c:	$(SRCDIR)/printf.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/printf.c | sed -f $(SRCDIR)/VERSION >printf_.c
 
 printf.o:	printf_.c printf.h  $(SRCDIR)/config.h
 	$(XTCC) -o printf.o -c printf_.c
 
 printf.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 rebuild_.c:	$(SRCDIR)/rebuild.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/rebuild.c | sed -f $(SRCDIR)/VERSION >rebuild_.c
 
 rebuild.o:	rebuild_.c rebuild.h  $(SRCDIR)/config.h
 	$(XTCC) -o rebuild.o -c rebuild_.c
 
 rebuild.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 rss_.c:	$(SRCDIR)/rss.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/rss.c | sed -f $(SRCDIR)/VERSION >rss_.c
 
 rss.o:	rss_.c rss.h  $(SRCDIR)/config.h
 	$(XTCC) -o rss.o -c rss_.c
 
 rss.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 schema_.c:	$(SRCDIR)/schema.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/schema.c | sed -f $(SRCDIR)/VERSION >schema_.c
 
 schema.o:	schema_.c schema.h  $(SRCDIR)/config.h
 	$(XTCC) -o schema.o -c schema_.c
 
 schema.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 setup_.c:	$(SRCDIR)/setup.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/setup.c | sed -f $(SRCDIR)/VERSION >setup_.c
 
 setup.o:	setup_.c setup.h  $(SRCDIR)/config.h
 	$(XTCC) -o setup.o -c setup_.c
 
 setup.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 sha1_.c:	$(SRCDIR)/sha1.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/sha1.c | sed -f $(SRCDIR)/VERSION >sha1_.c
 
 sha1.o:	sha1_.c sha1.h  $(SRCDIR)/config.h
 	$(XTCC) -o sha1.o -c sha1_.c
 
 sha1.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 style_.c:	$(SRCDIR)/style.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/style.c | sed -f $(SRCDIR)/VERSION >style_.c
 
 style.o:	style_.c style.h  $(SRCDIR)/config.h
 	$(XTCC) -o style.o -c style_.c
 
 style.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 subscript_.c:	$(SRCDIR)/subscript.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/subscript.c | sed -f $(SRCDIR)/VERSION >subscript_.c
 
 subscript.o:	subscript_.c subscript.h  $(SRCDIR)/config.h
 	$(XTCC) -o subscript.o -c subscript_.c
 
 subscript.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 sync_.c:	$(SRCDIR)/sync.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/sync.c | sed -f $(SRCDIR)/VERSION >sync_.c
 
 sync.o:	sync_.c sync.h  $(SRCDIR)/config.h
 	$(XTCC) -o sync.o -c sync_.c
 
 sync.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 tag_.c:	$(SRCDIR)/tag.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/tag.c | sed -f $(SRCDIR)/VERSION >tag_.c
 
 tag.o:	tag_.c tag.h  $(SRCDIR)/config.h
 	$(XTCC) -o tag.o -c tag_.c
 
 tag.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 tagview_.c:	$(SRCDIR)/tagview.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/tagview.c | sed -f $(SRCDIR)/VERSION >tagview_.c
 
 tagview.o:	tagview_.c tagview.h  $(SRCDIR)/config.h
 	$(XTCC) -o tagview.o -c tagview_.c
 
 tagview.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 timeline_.c:	$(SRCDIR)/timeline.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/timeline.c | sed -f $(SRCDIR)/VERSION >timeline_.c
 
 timeline.o:	timeline_.c timeline.h  $(SRCDIR)/config.h
 	$(XTCC) -o timeline.o -c timeline_.c
 
 timeline.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 tkt_.c:	$(SRCDIR)/tkt.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/tkt.c | sed -f $(SRCDIR)/VERSION >tkt_.c
 
 tkt.o:	tkt_.c tkt.h  $(SRCDIR)/config.h
 	$(XTCC) -o tkt.o -c tkt_.c
 
 tkt.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 tktconfig_.c:	$(SRCDIR)/tktconfig.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/tktconfig.c | sed -f $(SRCDIR)/VERSION >tktconfig_.c
 
 tktconfig.o:	tktconfig_.c tktconfig.h  $(SRCDIR)/config.h
 	$(XTCC) -o tktconfig.o -c tktconfig_.c
 
 tktconfig.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 tktsetup_.c:	$(SRCDIR)/tktsetup.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/tktsetup.c | sed -f $(SRCDIR)/VERSION >tktsetup_.c
 
 tktsetup.o:	tktsetup_.c tktsetup.h  $(SRCDIR)/config.h
 	$(XTCC) -o tktsetup.o -c tktsetup_.c
 
 tktsetup.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 undo_.c:	$(SRCDIR)/undo.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/undo.c | sed -f $(SRCDIR)/VERSION >undo_.c
 
 undo.o:	undo_.c undo.h  $(SRCDIR)/config.h
 	$(XTCC) -o undo.o -c undo_.c
 
 undo.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 update_.c:	$(SRCDIR)/update.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/update.c | sed -f $(SRCDIR)/VERSION >update_.c
 
 update.o:	update_.c update.h  $(SRCDIR)/config.h
 	$(XTCC) -o update.o -c update_.c
 
 update.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 url_.c:	$(SRCDIR)/url.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/url.c | sed -f $(SRCDIR)/VERSION >url_.c
 
 url.o:	url_.c url.h  $(SRCDIR)/config.h
 	$(XTCC) -o url.o -c url_.c
 
 url.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 user_.c:	$(SRCDIR)/user.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/user.c | sed -f $(SRCDIR)/VERSION >user_.c
 
 user.o:	user_.c user.h  $(SRCDIR)/config.h
 	$(XTCC) -o user.o -c user_.c
 
 user.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 verify_.c:	$(SRCDIR)/verify.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/verify.c | sed -f $(SRCDIR)/VERSION >verify_.c
 
 verify.o:	verify_.c verify.h  $(SRCDIR)/config.h
 	$(XTCC) -o verify.o -c verify_.c
 
 verify.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 vfile_.c:	$(SRCDIR)/vfile.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/vfile.c | sed -f $(SRCDIR)/VERSION >vfile_.c
 
 vfile.o:	vfile_.c vfile.h  $(SRCDIR)/config.h
 	$(XTCC) -o vfile.o -c vfile_.c
 
 vfile.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 wiki_.c:	$(SRCDIR)/wiki.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/wiki.c | sed -f $(SRCDIR)/VERSION >wiki_.c
 
 wiki.o:	wiki_.c wiki.h  $(SRCDIR)/config.h
 	$(XTCC) -o wiki.o -c wiki_.c
 
 wiki.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 wikiformat_.c:	$(SRCDIR)/wikiformat.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/wikiformat.c | sed -f $(SRCDIR)/VERSION >wikiformat_.c
 
 wikiformat.o:	wikiformat_.c wikiformat.h  $(SRCDIR)/config.h
 	$(XTCC) -o wikiformat.o -c wikiformat_.c
 
 wikiformat.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 xfer_.c:	$(SRCDIR)/xfer.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/xfer.c | sed -f $(SRCDIR)/VERSION >xfer_.c
 
 xfer.o:	xfer_.c xfer.h  $(SRCDIR)/config.h
 	$(XTCC) -o xfer.o -c xfer_.c
 
 xfer.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 zip_.c:	$(SRCDIR)/zip.c $(SRCDIR)/VERSION translate
 	./translate $(SRCDIR)/zip.c | sed -f $(SRCDIR)/VERSION >zip_.c
 
 zip.o:	zip_.c zip.h  $(SRCDIR)/config.h
 	$(XTCC) -o zip.o -c zip_.c
 
 zip.h:	makeheaders
-	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h
+	./makeheaders  add_.c:add.h admin_.c:admin.h bag_.c:bag.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h my_page_.c:my_page.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h rss_.c:rss.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h subscript_.c:subscript.h sync_.c:sync.h tag_.c:tag.h tagview_.c:tagview.h timeline_.c:timeline.h tkt_.c:tkt.h tktconfig_.c:tktconfig.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h $(SRCDIR)/th.h ./VERSION.h
 	touch headers
 
 sqlite3.o:	$(SRCDIR)/sqlite3.c
 	$(XTCC) -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_PRIVATE= -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_FTS3=1 -c $(SRCDIR)/sqlite3.c -o sqlite3.o
+
+th.o:	$(SRCDIR)/th.c
+	$(XTCC) -I$(SRCDIR) -c $(SRCDIR)/th.c -o th.o
+
+th_lang.o:	$(SRCDIR)/th_lang.c
+	$(XTCC) -I$(SRCDIR) -c $(SRCDIR)/th_lang.c -o th_lang.o
 

Modified src/makemake.tcl from [27a44eb217] to [251e142ac8].

@@ -1,11 +1,12 @@
 #!/usr/bin/tclsh
 #
 # Run this TCL script to generate the "main.mk" makefile.
 #
 
-# Basenames of all source files:
+# Basenames of all source files that get preprocessed using
+# "translate" and "makeheaders"
 #
 set src {
   add
   admin
   bag
@@ -131,12 +132,12 @@
 		$(SRCDIR)/../manifest.uuid >>VERSION.h
 	awk '$$1=="D"{printf "#define MANIFEST_DATE \"%s %s\"\n",\
 		substr($$2,1,10),substr($$2,12)}' \
 		$(SRCDIR)/../manifest >>VERSION.h
 
-$(APPNAME):	headers $(OBJ) sqlite3.o
-	$(TCC) -o $(APPNAME) $(OBJ) sqlite3.o $(LIB)
+$(APPNAME):	headers $(OBJ) sqlite3.o th.o th_lang.o
+	$(TCC) -o $(APPNAME) $(OBJ) sqlite3.o th.o th_lang.o $(LIB)
 
 # This rule prevents make from using its default rules to try build
 # an executable named "manifest" out of the file named "manifest.c"
 #
 $(SRCDIR)/../manifest:
@@ -153,11 +154,13 @@
 set mhargs {}
 foreach s [lsort $src] {
   append mhargs " ${s}_.c:$s.h"
   set extra_h($s) {}
 }
-append mhargs " \$(SRCDIR)/sqlite3.h ./VERSION.h"
+append mhargs " \$(SRCDIR)/sqlite3.h"
+append mhargs " \$(SRCDIR)/th.h"
+append mhargs " ./VERSION.h"
 puts "headers:\tmakeheaders mkindex \$(TRANS_SRC) ./VERSION.h"
 puts "\t./makeheaders $mhargs"
 puts "\t./mkindex \$(TRANS_SRC) >page_index.h"
 puts "\ttouch headers\n"
 set extra_h(main) page_index.h
@@ -175,5 +178,11 @@
 puts "sqlite3.o:\t\$(SRCDIR)/sqlite3.c"
 set opt {-DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_PRIVATE=}
 append opt " -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4"
 append opt " -DSQLITE_ENABLE_FTS3=1"
 puts "\t\$(XTCC) $opt -c \$(SRCDIR)/sqlite3.c -o sqlite3.o\n"
+
+puts "th.o:\t\$(SRCDIR)/th.c"
+puts "\t\$(XTCC) -I\$(SRCDIR) -c \$(SRCDIR)/th.c -o th.o\n"
+
+puts "th_lang.o:\t\$(SRCDIR)/th_lang.c"
+puts "\t\$(XTCC) -I\$(SRCDIR) -c \$(SRCDIR)/th_lang.c -o th_lang.o\n"

Added src/th.c version [a687d76a2d]

@@ -1,1 +1,2674 @@
+
+/*
+** The implementation of the TH core. This file contains the parser, and
+** the implementation of the interface in th.h.
+*/
+
+#include "th.h"
+#include <string.h>
+#include <assert.h>
+
+typedef struct Th_Command   Th_Command;
+typedef struct Th_Frame     Th_Frame;
+typedef struct Th_Variable  Th_Variable;
+
+/*
+** Interpreter structure.
+*/
+struct Th_Interp {
+  Th_Vtab *pVtab;     /* Copy of the argument passed to Th_CreateInterp() */
+  uchar *zResult;     /* Current interpreter result (Th_Malloc()ed) */
+  int nResult;        /* number of bytes in zResult */
+  Th_Hash *paCmd;     /* Table of registered commands */
+  Th_Frame *pFrame;   /* Current execution frame */
+  int isListMode;     /* True if thSplitList() should operate in "list" mode */
+};
+
+/*
+** Each TH command registered using Th_CreateCommand() is represented
+** by an instance of the following structure stored in the Th_Interp.paCmd
+** hash-table.
+*/
+struct Th_Command {
+  int (*xProc)(Th_Interp *, void *, int, const uchar **, int *);
+  void *pContext;
+  void (*xDel)(Th_Interp *, void *);
+};
+
+/*
+** Each stack frame (variable scope) is represented by an instance
+** of this structure. Variable values set using the Th_SetVar command
+** are stored in the Th_Frame.paVar hash table member of the associated
+** stack frame object.
+**
+** When an interpreter is created, a single Th_Frame structure is also
+** allocated - the global variable scope. Th_Interp.pFrame (the current
+** interpreter frame) is initialised to point to this Th_Frame. It is
+** not deleted for the lifetime of the interpreter (because the global
+** frame never goes out of scope).
+**
+** New stack frames are created by the Th_InFrame() function. Before
+** invoking its callback function, Th_InFrame() allocates a new Th_Frame
+** structure with pCaller set to the current frame (Th_Interp.pFrame),
+** and sets the current frame to the new frame object. After the callback
+** has been invoked, the allocated Th_Frame is deleted and the value
+** of the current frame pointer restored.
+**
+** By default, the Th_SetVar(), Th_UnsetVar() and Th_GetVar() functions
+** access variable values in the current frame. If they need to access
+** the global frame, they do so by traversing the pCaller pointer list.
+** Likewise, the Th_LinkVar() function uses the pCaller pointers to
+** link to variables located in the global or other stack frames.
+*/
+struct Th_Frame {
+  Th_Hash *paVar;               /* Variables defined in this scope */
+  Th_Frame *pCaller;            /* Calling frame */
+};
+
+/*
+** This structure represents a value assigned to a th1 variable.
+**
+** The Th_Frame.paVar hash table maps from variable name (a th1 string)
+** to a pointer to an instance of the following structure. More than
+** one hash table entry may map to a single structure if variable
+** links have been created using Th_LinkVar(). The number of references
+** is stored in Th_Variable.nRef.
+**
+** For scalar variables, Th_Variable.zData is never 0. Th_Variable.nData
+** stores the number of bytes in the value pointed to by zData.
+**
+** For an array variable, Th_Variable.zData is 0 and pHash points to
+** a hash table mapping between array key name (a th1 string) and
+** a the pointer to the Th_Variable structure holding the scalar
+** value.
+*/
+struct Th_Variable {
+  int nRef;                   /* Number of references to this structure */
+  int nData;                  /* Number of bytes at Th_Variable.zData */
+  uchar *zData;               /* Data for scalar variables */
+  Th_Hash *pHash;             /* Data for array variables */
+};
+
+/*
+** Hash table API:
+*/
+#define TH_HASHSIZE 257
+struct Th_Hash {
+  Th_HashEntry *a[TH_HASHSIZE];
+};
+
+static int thEvalLocal(Th_Interp *, const uchar *, int);
+static int thSplitList(Th_Interp*, const uchar*, int, uchar***, int **, int*);
+
+static int thHexdigit(uchar c);
+static int thEndOfLine(const uchar *, int);
+
+static int  thPushFrame(Th_Interp*, Th_Frame*);
+static void thPopFrame(Th_Interp*);
+
+static void thFreeVariable(Th_HashEntry*, void*);
+static void thFreeCommand(Th_HashEntry*, void*);
+
+/*
+** The following are used by both the expression and language parsers.
+** Given that the start of the input string (z, n) is a language
+** construct of the relevant type (a command enclosed in [], an escape
+** sequence etc.), these functions determine the number of bytes
+** of the input consumed by the construct. For example:
+**
+**   int nByte;
+**   thNextCommand(interp, "[expr $a+1] $nIter", 18, &nByte);
+**
+** results in variable nByte being set to 11. Or,
+**
+**   thNextVarname(interp, "$a+1", 4, &nByte);
+**
+** results in nByte being set to 2.
+*/
+static int thNextCommand(Th_Interp*, const uchar *z, int n, int *pN);
+static int thNextEscape (Th_Interp*, const uchar *z, int n, int *pN);
+static int thNextVarname(Th_Interp*, const uchar *z, int n, int *pN);
+static int thNextNumber (Th_Interp*, const uchar *z, int n, int *pN);
+static int thNextSpace  (Th_Interp*, const uchar *z, int n, int *pN);
+
+/*
+** Given that the input string (z, n) contains a language construct of
+** the relevant type (a command enclosed in [], an escape sequence
+** like "\xFF" or a variable reference like "${varname}", perform
+** substitution on the string and store the resulting string in
+** the interpreter result.
+*/
+static int thSubstCommand(Th_Interp*, const uchar *z, int n);
+static int thSubstEscape (Th_Interp*, const uchar *z, int n);
+static int thSubstVarname(Th_Interp*, const uchar *z, int n);
+
+/*
+** Given that there is a th1 word located at the start of the input
+** string (z, n), determine the length in bytes of that word. If the
+** isCmd argument is non-zero, then an unescaped ";" byte not
+** located inside of a block or quoted string is considered to mark
+** the end of the word.
+*/
+static int thNextWord(Th_Interp*, const uchar *z, int n, int *pN, int isCmd);
+
+/*
+** Perform substitution on the word contained in the input string (z, n).
+** Store the resulting string in the interpreter result.
+*/
+static int thSubstWord(Th_Interp*, const uchar *z, int n);
+
+/*
+** The Buffer structure and the thBufferXXX() functions are used to make
+** memory allocation easier when building up a result.
+*/
+struct Buffer {
+  uchar *zBuf;
+  int nBuf;
+  int nBufAlloc;
+};
+typedef struct Buffer Buffer;
+static int  thBufferWrite(Th_Interp *interp, Buffer *, const uchar *, int);
+static void thBufferInit(Buffer *);
+static void thBufferFree(Th_Interp *interp, Buffer *);
+
+/*
+** Append nAdd bytes of content copied from zAdd to the end of buffer
+** pBuffer. If there is not enough space currently allocated, resize
+** the allocation to make space.
+*/
+static int thBufferWrite(
+  Th_Interp *interp,
+  Buffer *pBuffer,
+  const uchar *zAdd,
+  int nAdd
+){
+  int nReq;
+
+  if( nAdd<0 ){
+    nAdd = th_strlen(zAdd);
+  }
+  nReq = pBuffer->nBuf+nAdd+1;
+
+  if( nReq>pBuffer->nBufAlloc ){
+    uchar *zNew;
+    int nNew;
+
+    nNew = nReq*2;
+    zNew = (uchar *)Th_Malloc(interp, nNew);
+    memcpy(zNew, pBuffer->zBuf, pBuffer->nBuf);
+    Th_Free(interp, pBuffer->zBuf);
+    pBuffer->nBufAlloc = nNew;
+    pBuffer->zBuf = zNew;
+  }
+
+  memcpy(&pBuffer->zBuf[pBuffer->nBuf], zAdd, nAdd);
+  pBuffer->nBuf += nAdd;
+  pBuffer->zBuf[pBuffer->nBuf] = '\0';
+
+  return TH_OK;
+}
+#define thBufferWrite(a,b,c,d) thBufferWrite(a,b,(const uchar *)c,d)
+
+/*
+** Initialize the Buffer structure pointed to by pBuffer.
+*/
+static void thBufferInit(Buffer *pBuffer){
+  memset(pBuffer, 0, sizeof(Buffer));
+}
+
+/*
+** Zero the buffer pointed to by pBuffer and free the associated memory
+** allocation.
+*/
+static void thBufferFree(Th_Interp *interp, Buffer *pBuffer){
+  Th_Free(interp, pBuffer->zBuf);
+  thBufferInit(pBuffer);
+}
+
+/*
+** Assuming parameter c contains a hexadecimal digit character,
+** return the corresponding value of that digit. If c is not
+** a hexadecimal digit character, -1 is returned.
+*/
+static int thHexdigit(uchar c){
+  switch (c) {
+    case '0': return 0;
+    case '1': return 1;
+    case '2': return 2;
+    case '3': return 3;
+    case '4': return 4;
+    case '5': return 5;
+    case '6': return 6;
+    case '7': return 7;
+    case '8': return 8;
+    case '9': return 9;
+    case 'a': case 'A': return 10;
+    case 'b': case 'B': return 11;
+    case 'c': case 'C': return 12;
+    case 'd': case 'D': return 13;
+    case 'e': case 'E': return 14;
+    case 'f': case 'F': return 15;
+  }
+  return -1;
+}
+
+/*
+** Argument pEntry points to an entry in a stack frame hash table
+** (Th_Frame.paVar). Decrement the refrerence count of the Th_Variable
+** structure that the entry points to. Free the Th_Variable if its
+** reference count reaches 0.
+**
+** Argument pContext is a pointer to the interpreter structure.
+*/
+static void thFreeVariable(Th_HashEntry *pEntry, void *pContext){
+  Th_Variable *pValue = (Th_Variable *)pEntry->pData;
+  pValue->nRef--;
+  assert( pValue->nRef>=0 );
+  if( pValue->nRef==0 ){
+    Th_Interp *interp = (Th_Interp *)pContext;
+    Th_Free(interp, pValue->zData);
+    if( pValue->pHash ){
+      Th_HashIterate(interp, pValue->pHash, thFreeVariable, pContext);
+      Th_HashDelete(interp, pValue->pHash);
+    }
+    Th_Free(interp, pValue);
+  }
+}
+
+/*
+** Argument pEntry points to an entry in the command hash table
+** (Th_Interp.paCmd). Delete the Th_Command structure that the
+** entry points to.
+**
+** Argument pContext is a pointer to the interpreter structure.
+*/
+static void thFreeCommand(Th_HashEntry *pEntry, void *pContext){
+  Th_Command *pCommand = (Th_Command *)pEntry->pData;
+  if( pCommand->xDel ){
+    pCommand->xDel((Th_Interp *)pContext, pCommand->pContext);
+  }
+  Th_Free((Th_Interp *)pContext, pEntry->pData);
+  pEntry->pData = 0;
+}
+
+/*
+** Push a new frame onto the stack.
+*/
+static int thPushFrame(Th_Interp *interp, Th_Frame *pFrame){
+  pFrame->paVar = Th_HashNew(interp);
+  pFrame->pCaller = interp->pFrame;
+  interp->pFrame = pFrame;
+  return TH_OK;
+}
+
+/*
+** Pop a frame off the top of the stack.
+*/
+static void thPopFrame(Th_Interp *interp){
+  Th_Frame *pFrame = interp->pFrame;
+  Th_HashIterate(interp, pFrame->paVar, thFreeVariable, (void *)interp);
+  Th_HashDelete(interp, pFrame->paVar);
+  interp->pFrame = pFrame->pCaller;
+}
+
+/*
+** The first part of the string (zInput,nInput) contains an escape
+** sequence. Set *pnEscape to the number of bytes in the escape sequence.
+** If there is a parse error, return TH_ERROR and set the interpreter
+** result to an error message. Otherwise return TH_OK.
+*/
+static int thNextEscape(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnEscape
+){
+  int i = 2;
+
+  assert(nInput>0);
+  assert(zInput[0]=='\\');
+
+  if( nInput<=1 ){
+    return TH_ERROR;
+  }
+
+  switch( zInput[1] ){
+    case 'x': i = 4;
+  }
+
+  if( i>nInput ){
+    return TH_ERROR;
+  }
+  *pnEscape = i;
+  return TH_OK;
+}
+
+/*
+** The first part of the string (zInput,nInput) contains a variable
+** reference. Set *pnVarname to the number of bytes in the variable
+** reference. If there is a parse error, return TH_ERROR and set the
+** interpreter result to an error message. Otherwise return TH_OK.
+*/
+int thNextVarname(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnVarname
+){
+  int i;
+
+  assert(nInput>0);
+  assert(zInput[0]=='$');
+
+  if( nInput>0 && zInput[1]=='{' ){
+    for(i=2; i<nInput && zInput[i]!='}'; i++);
+    if( i==nInput ){
+      return TH_ERROR;
+    }
+    i++;
+  }else{
+    i = 1;
+    if( nInput>2 && zInput[1]==':' && zInput[2]==':' ){
+      i += 2;
+    }
+    for(; i<nInput; i++){
+      if( zInput[i]=='(' ){
+        for(i++; i<nInput; i++){
+          if( zInput[i]==')' ) break;
+          if( zInput[i]=='\\' ) i++;
+          if( zInput[i]=='{' || zInput[i]=='[' || zInput[i]=='"' ){
+            int nWord;
+            int rc = thNextWord(interp, &zInput[i], nInput-i, &nWord, 0);
+            if( rc!=TH_OK ){
+              return rc;
+            }
+            i += nWord;
+          }
+        }
+        if( i>=nInput ){
+          Th_ErrorMessage(interp, "Unmatched brackets:", zInput, nInput);
+          return TH_ERROR;
+        }
+        i++;
+        break;
+      }
+      if( !th_isalnum(zInput[i]) && zInput[i]!='_' ) break;
+    }
+  }
+
+  *pnVarname = i;
+  return TH_OK;
+}
+
+/*
+** The first part of the string (zInput,nInput) contains a command
+** enclosed in a "[]" block. Set *pnCommand to the number of bytes in
+** the variable reference. If there is a parse error, return TH_ERROR
+** and set the interpreter result to an error message. Otherwise return
+** TH_OK.
+*/
+int thNextCommand(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnCommand
+){
+  int nBrace = 0;
+  int nSquare = 0;
+  int i;
+
+  assert(nInput>0);
+  assert( zInput[0]=='[' || zInput[0]=='{' );
+
+  for(i=0; i<nInput && (i==0 || nBrace>0 || nSquare>0); i++){
+    switch( zInput[i] ){
+      case '\\': i++; break;
+      case '{': nBrace++; break;
+      case '}': nBrace--; break;
+      case '[': nSquare++; break;
+      case ']': nSquare--; break;
+    }
+  }
+  if( nBrace || nSquare ){
+    return TH_ERROR;
+  }
+
+  *pnCommand = i;
+
+  return TH_OK;
+}
+
+/*
+** Set *pnSpace to the number of whitespace bytes at the start of
+** input string (zInput, nInput). Always return TH_OK.
+*/
+int thNextSpace(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnSpace
+){
+  int i;
+  for(i=0; i<nInput && th_isspace(zInput[i]); i++);
+  *pnSpace = i;
+  return TH_OK;
+}
+
+/*
+** The first byte of the string (zInput,nInput) is not white-space.
+** Set *pnWord to the number of bytes in the th1 word that starts
+** with this byte. If a complete word cannot be parsed or some other
+** error occurs, return TH_ERROR and set the interpreter result to
+** an error message. Otherwise return TH_OK.
+**
+** If the isCmd argument is non-zero, then an unescaped ";" byte not
+** located inside of a block or quoted string is considered to mark
+** the end of the word.
+*/
+static int thNextWord(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnWord,
+  int isCmd
+){
+  int iEnd = 0;
+
+  assert( !th_isspace(zInput[0]) );
+
+  if( zInput[0]=='"' ){
+    /* The word is terminated by the next unescaped '"' character. */
+    iEnd++;
+    while( iEnd<nInput && zInput[iEnd]!='"' ){
+      if( zInput[iEnd]=='\\' ){
+        iEnd++;
+      }
+      iEnd++;
+    }
+    iEnd++;
+  }else{
+    int nBrace = 0;
+    int nSq = 0;
+    while( iEnd<nInput && (nBrace>0 || nSq>0 ||
+      (!th_isspace(zInput[iEnd]) && (!isCmd || zInput[iEnd]!=';'))
+    )){
+      switch( zInput[iEnd] ){
+        case '\\': iEnd++; break;
+        case '{': if( nSq==0 ) nBrace++; break;
+        case '}': if( nSq==0 ) nBrace--; break;
+        case '[': if( nBrace==0 ) nSq++; break;
+        case ']': if( nBrace==0 ) nSq--; break;
+      }
+      iEnd++;
+    }
+    if( nBrace>0 || nSq>0 ){
+      /* Parse error */
+      return TH_ERROR;
+    }
+  }
+
+  if( iEnd>nInput ){
+    /* Parse error */
+    return TH_ERROR;
+  }
+  *pnWord = iEnd;
+  return TH_OK;
+}
+
+/*
+** The input string (zWord, nWord) contains a th1 script enclosed in
+** a [] block. Perform substitution on the input string and store the
+** resulting string in the interpreter result.
+*/
+static int thSubstCommand(
+  Th_Interp *interp,
+  const uchar *zWord,
+  int nWord
+){
+  assert(nWord>=2);
+  assert(zWord[0]=='[' && zWord[nWord-1]==']');
+  return thEvalLocal(interp, &zWord[1], nWord-2);
+}
+
+/*
+** The input string (zWord, nWord) contains a th1 variable reference
+** (a '$' byte followed by a variable name). Perform substitution on
+** the input string and store the resulting string in the interpreter
+** result.
+*/
+static int thSubstVarname(
+  Th_Interp *interp,
+  const uchar *zWord,
+  int nWord
+){
+  assert(nWord>=1);
+  assert(zWord[0]=='$');
+  assert(nWord==1 || zWord[1]!='{' || zWord[nWord-1]=='}');
+  if( nWord>1 && zWord[1]=='{' ){
+    zWord++;
+    nWord -= 2;
+  }else if( zWord[nWord-1]==')' ){
+    int i;
+    for(i=1; i<nWord && zWord[i]!='('; i++);
+    if( i<nWord ){
+      Buffer varname;
+      int nInner;
+      const uchar *zInner;
+
+      int rc = thSubstWord(interp, &zWord[i+1], nWord-i-2);
+      if( rc!=TH_OK ) return rc;
+
+      zInner = Th_GetResult(interp, &nInner);
+      thBufferInit(&varname);
+      thBufferWrite(interp, &varname, &zWord[1], i);
+      thBufferWrite(interp, &varname, zInner, nInner);
+      thBufferWrite(interp, &varname, ")", 1);
+      rc = Th_GetVar(interp, varname.zBuf, varname.nBuf);
+      thBufferFree(interp, &varname);
+      return rc;
+    }
+  }
+  return Th_GetVar(interp, &zWord[1], nWord-1);
+}
+
+/*
+** The input string (zWord, nWord) contains a th1 escape sequence.
+** Perform substitution on the input string and store the resulting
+** string in the interpreter result.
+*/
+static int thSubstEscape(
+  Th_Interp *interp,
+  const uchar *zWord,
+  int nWord
+){
+  uchar c;
+
+  assert(nWord>=2);
+  assert(zWord[0]=='\\');
+
+  switch( zWord[1] ){
+    case 'x': {
+      assert(nWord==4);
+      c = ((thHexdigit(zWord[2])<<4) + thHexdigit(zWord[3]));
+      break;
+    }
+    case 'n': {
+      c = '\n';
+      break;
+    }
+    default: {
+      assert(nWord==2);
+      c = zWord[1];
+      break;
+    }
+  }
+
+  Th_SetResult(interp, &c, 1);
+  return TH_OK;
+}
+
+/*
+** The input string (zWord, nWord) contains a th1 word. Perform
+** substitution on the input string and store the resulting
+** string in the interpreter result.
+*/
+static int thSubstWord(
+  Th_Interp *interp,
+  const uchar *zWord,
+  int nWord
+){
+  int rc = TH_OK;
+  Buffer output;
+  int i;
+
+  thBufferInit(&output);
+
+  if( nWord>1 && (zWord[0]=='{' && zWord[nWord-1]=='}') ){
+    rc = thBufferWrite(interp, &output, &zWord[1], nWord-2);
+  }else{
+
+    /* If the word is surrounded by double-quotes strip these away. */
+    if( nWord>1 && (zWord[0]=='"' && zWord[nWord-1]=='"') ){
+      zWord++;
+      nWord -= 2;
+    }
+
+    for(i=0; rc==TH_OK && i<nWord; i++){
+      int nGet;
+
+      int (*xGet)(Th_Interp *, const uchar*, int, int *) = 0;
+      int (*xSubst)(Th_Interp *, const uchar*, int) = 0;
+
+      switch( zWord[i] ){
+        case '\\':
+          xGet = thNextEscape; xSubst = thSubstEscape;
+          break;
+        case '[':
+          if( !interp->isListMode ){
+            xGet = thNextCommand; xSubst = thSubstCommand;
+            break;
+          }
+        case '$':
+          if( !interp->isListMode ){
+            xGet = thNextVarname; xSubst = thSubstVarname;
+            break;
+          }
+        default: {
+          thBufferWrite(interp, &output, &zWord[i], 1);
+          continue; /* Go to the next iteration of the for(...) loop */
+        }
+      }
+
+      rc = xGet(interp, &zWord[i], nWord-i, &nGet);
+      if( rc==TH_OK ){
+        rc = xSubst(interp, &zWord[i], nGet);
+      }
+      if( rc==TH_OK ){
+        const uchar *zRes;
+        int nRes;
+        zRes = Th_GetResult(interp, &nRes);
+        rc = thBufferWrite(interp, &output, zRes, nRes);
+        i += (nGet-1);
+      }
+    }
+  }
+
+  if( rc==TH_OK ){
+    Th_SetResult(interp, output.zBuf, output.nBuf);
+  }
+  thBufferFree(interp, &output);
+  return rc;
+}
+
+/*
+** Return true if one of the following is true of the buffer pointed
+** to by zInput, length nInput:
+**
+**   + It is empty, or
+**   + It contains nothing but white-space, or
+**   + It contains no non-white-space characters before the first
+**     newline character.
+**
+** Otherwise return false.
+*/
+static int thEndOfLine(const uchar *zInput, int nInput){
+  int i;
+  for(i=0; i<nInput && zInput[i]!='\n' && th_isspace(zInput[i]); i++);
+  return ((i==nInput || zInput[i]=='\n')?1:0);
+}
+
+/*
+** This function splits the supplied th1 list (contained in buffer zList,
+** size nList) into elements and performs word-substitution on each
+** element. If the Th_Interp.isListMode variable is true, then only
+** escape sequences are substituted (used by the Th_SplitList() function).
+** If Th_Interp.isListMode is false, then variable and command substitution
+** is also performed (used by Th_Eval()).
+**
+** If zList/nList does not contain a valid list, TH_ERROR is returned
+** and an error message stored in interp.
+**
+** If TH_OK is returned and pazElem is not NULL, the caller should free the
+** pointer written to (*pazElem) using Th_Free(). This releases memory
+** allocated for both the (*pazElem) and (*panElem) arrays. Example:
+**
+**     uchar **argv;
+**     int *argl;
+**     int argc;
+**
+**     // After this call, argv and argl point to valid arrays. The
+**     // number of elements in each is argc.
+**     //
+**     Th_SplitList(interp, zList, nList, &argv, &argl, &argc);
+**
+**     // Free all memory allocated by Th_SplitList(). The arrays pointed
+**     // to by argv and argl are invalidated by this call.
+**     //
+**     Th_Free(interp, argv);
+**
+*/
+static int thSplitList(
+  Th_Interp *interp,      /* Interpreter context */
+  const uchar *zList,     /* Pointer to buffer containing input list */
+  int nList,              /* Size of buffer pointed to by zList */
+  uchar ***pazElem,       /* OUT: Array of list elements */
+  int **panElem,          /* OUT: Lengths of each list element */
+  int *pnCount            /* OUT: Number of list elements */
+){
+  int rc = TH_OK;
+
+  Buffer strbuf;
+  Buffer lenbuf;
+  int nCount = 0;
+
+  const uchar *zInput = zList;
+  int nInput = nList;
+
+  thBufferInit(&strbuf);
+  thBufferInit(&lenbuf);
+
+  while( nInput>0 ){
+    const uchar *zWord;
+    int nWord;
+
+    thNextSpace(interp, zInput, nInput, &nWord);
+    zInput += nWord;
+    nInput = nList-(zInput-zList);
+
+    if( TH_OK!=(rc = thNextWord(interp, zInput, nInput, &nWord, 0))
+     || TH_OK!=(rc = thSubstWord(interp, zInput, nWord))
+    ){
+      goto finish;
+    }
+    zInput = &zInput[nWord];
+    nInput = nList-(zInput-zList);
+    if( nWord>0 ){
+      zWord = Th_GetResult(interp, &nWord);
+      thBufferWrite(interp, &strbuf, zWord, nWord);
+      thBufferWrite(interp, &strbuf, "\0", 1);
+      thBufferWrite(interp, &lenbuf, &nWord, sizeof(int));
+      nCount++;
+    }
+  }
+  assert((lenbuf.nBuf/sizeof(int))==nCount);
+
+  assert((pazElem && panElem) || (!pazElem && !panElem));
+  if( pazElem && rc==TH_OK ){
+    int i;
+    uchar *zElem;
+    int *anElem;
+    uchar **azElem = Th_Malloc(interp,
+      sizeof(uchar*) * nCount +      /* azElem */
+      sizeof(int) * nCount +         /* anElem */
+      strbuf.nBuf                    /* space for list element strings */
+    );
+    anElem = (int *)&azElem[nCount];
+    zElem = (uchar *)&anElem[nCount];
+    memcpy(anElem, lenbuf.zBuf, lenbuf.nBuf);
+    memcpy(zElem, strbuf.zBuf, strbuf.nBuf);
+    for(i=0; i<nCount;i++){
+      azElem[i] = zElem;
+      zElem += (anElem[i] + 1);
+    }
+    *pazElem = azElem;
+    *panElem = anElem;
+  }
+  if( pnCount ){
+    *pnCount = nCount;
+  }
+
+ finish:
+  thBufferFree(interp, &strbuf);
+  thBufferFree(interp, &lenbuf);
+  return rc;
+}
+
+/*
+** Evaluate the th1 script contained in the string (zProgram, nProgram)
+** in the current stack frame.
+*/
+static int thEvalLocal(Th_Interp *interp, const uchar *zProgram, int nProgram){
+  int rc = TH_OK;
+  const uchar *zInput = zProgram;
+  int nInput = nProgram;
+
+  while( rc==TH_OK && nInput ){
+    Th_HashEntry *pEntry;
+    int nSpace;
+    const uchar *zFirst;
+
+    uchar **argv;
+    int *argl;
+    int argc;
+
+    assert(nInput>=0);
+
+    /* Skip a semi-colon */
+    if( *zInput==';' ){
+      zInput++;
+      nInput--;
+    }
+
+    /* Skip past leading white-space. */
+    thNextSpace(interp, zInput, nInput, &nSpace);
+    zInput += nSpace;
+    nInput -= nSpace;
+    zFirst = zInput;
+
+    /* Check for a comment. If found, skip to the end of the line. */
+    if( zInput[0]=='#' ){
+      while( !thEndOfLine(zInput, nInput) ){
+        zInput++;
+        nInput--;
+      }
+      continue;
+    }
+
+    /* Gobble up input a word at a time until the end of the command
+    ** (a semi-colon or end of line).
+    */
+    while( rc==TH_OK && *zInput!=';' && !thEndOfLine(zInput, nInput) ){
+      int nWord;
+      thNextSpace(interp, zInput, nInput, &nSpace);
+      rc = thNextWord(interp, &zInput[nSpace], nInput-nSpace, &nWord, 1);
+      zInput += (nSpace+nWord);
+      nInput -= (nSpace+nWord);
+    }
+    if( rc!=TH_OK ) continue;
+
+    /* Split the command into an array of words. This call also does
+    ** substitution of each individual word.
+    */
+    rc = thSplitList(interp, zFirst, zInput-zFirst, &argv, &argl, &argc);
+    if( rc!=TH_OK ) continue;
+
+    if( argc>0 ){
+
+      /* Look up the command name in the command hash-table. */
+      pEntry = Th_HashFind(interp, interp->paCmd, argv[0], argl[0], 0);
+      if( !pEntry ){
+        Th_ErrorMessage(interp, "no such command: ", argv[0], argl[0]);
+        rc = TH_ERROR;
+      }
+
+      /* Call the command procedure. */
+      if( rc==TH_OK ){
+        Th_Command *p = (Th_Command *)(pEntry->pData);
+        const uchar **azArg = (const uchar **)argv;
+        rc = p->xProc(interp, p->pContext, argc, azArg, argl);
+      }
+
+      /* If an error occured, add this command to the stack trace report. */
+      if( rc==TH_ERROR ){
+        uchar *zRes;
+        int nRes;
+        uchar *zStack = 0;
+        int nStack = 0;
+
+        zRes = Th_TakeResult(interp, &nRes);
+        if( TH_OK==Th_GetVar(interp, (uchar *)"::th_stack_trace", -1) ){
+          zStack = Th_TakeResult(interp, &nStack);
+        }
+        Th_ListAppend(interp, &zStack, &nStack, zFirst, zInput-zFirst);
+        Th_SetVar(interp, (uchar *)"::th_stack_trace", -1, zStack, nStack);
+        Th_SetResult(interp, zRes, nRes);
+        Th_Free(interp, zRes);
+        Th_Free(interp, zStack);
+      }
+    }
+
+    Th_Free(interp, argv);
+  }
+
+  return rc;
+}
+
+/*
+** Interpret an integer frame identifier passed to either Th_Eval() or
+** Th_LinkVar(). If successful, return a pointer to the identified
+** Th_Frame structure. If unsuccessful (no such frame), return 0 and
+** leave an error message in the interpreter result.
+**
+** Argument iFrame is interpreted as follows:
+**
+**   * If iFrame is 0, this means the current frame.
+**
+**   * If iFrame is negative, then the nth frame up the stack, where
+**     n is the absolute value of iFrame. A value of -1 means the
+**     calling procedure.
+**
+**   * If iFrame is +ve, then the nth frame from the bottom of the
+**     stack. An iFrame value of 1 means the toplevel (global) frame.
+*/
+static Th_Frame *getFrame(Th_Interp *interp, int iFrame){
+  Th_Frame *p = interp->pFrame;
+  int i;
+  if( iFrame>0 ){
+    for(i=0; p; i++){
+      p = p->pCaller;
+    }
+    iFrame = (i*-1) + iFrame;
+    p = interp->pFrame;
+  }
+  for(i=0; p && i<(iFrame*-1); i++){
+    p = p->pCaller;
+  }
+
+  if( !p ){
+    uchar *zFrame;
+    int nFrame;
+    Th_SetResultInt(interp, iFrame);
+    zFrame = Th_TakeResult(interp, &nFrame);
+    Th_ErrorMessage(interp, "no such frame:", zFrame, nFrame);
+    Th_Free(interp, zFrame);
+  }
+  return p;
+}
+
+
+/*
+** Evaluate th1 script (zProgram, nProgram) in the frame identified by
+** argument iFrame. Leave either an error message or a result in the
+** interpreter result and return a th1 error code (TH_OK, TH_ERROR,
+** TH_RETURN, TH_CONTINUE or TH_BREAK).
+*/
+int Th_Eval(Th_Interp *interp, int iFrame, const uchar *zProgram, int nProgram){
+  int rc = TH_OK;
+  Th_Frame *pSavedFrame = interp->pFrame;
+
+  /* Set Th_Interp.pFrame to the frame that this script is to be
+  ** evaluated in. The current frame is saved in pSavedFrame and will
+  ** be restored before this function returns.
+  */
+  interp->pFrame = getFrame(interp, iFrame);
+
+  if( !interp->pFrame ){
+    rc = TH_ERROR;
+  }else{
+    int nInput = nProgram;
+
+    if( nInput<0 ){
+      nInput = th_strlen(zProgram);
+    }
+    rc = thEvalLocal(interp, zProgram, nInput);
+  }
+
+  interp->pFrame = pSavedFrame;
+  return rc;
+}
+
+/*
+** Input string (zVarname, nVarname) contains a th1 variable name. It
+** may be a simple scalar variable name or it may be a reference
+** to an array member. The variable name may or may not begin with
+** "::", indicating that the name refers to a global variable, not
+** a local scope one.
+**
+** This function inspects and categorizes the supplied variable name.
+**
+** If the name is a global reference, *pisGlobal is set to true. Otherwise
+** false. Output string (*pzOuter, *pnOuter) is set to the variable name
+** if it is a scalar reference, or the name of the array if it is an
+** array variable. If the variable is a scalar, *pzInner is set to 0.
+** If it is an array variable, (*pzInner, *pnInner) is set to the
+** array key name.
+*/
+static int thAnalyseVarname(
+  const uchar *zVarname,
+  int nVarname,
+  const uchar **pzOuter,     /* OUT: Pointer to scalar/array name */
+  int *pnOuter,              /* OUT: Number of bytes at *pzOuter */
+  const uchar **pzInner,     /* OUT: Pointer to array key (or null) */
+  int *pnInner,              /* OUT: Number of bytes at *pzInner */
+  int *pisGlobal             /* OUT: Set to true if this is a global ref */
+){
+  const uchar *zOuter = zVarname;
+  int nOuter;
+  const uchar *zInner = 0;
+  int nInner = 0;
+  int isGlobal = 0;
+  int i;
+
+  if( nVarname<0 ){
+    nVarname = th_strlen(zVarname);
+  }
+  nOuter = nVarname;
+
+  /* If the variable name starts with "::", then do the lookup is in the
+  ** uppermost (global) frame.
+  */
+  if( nVarname>2 && zVarname[0]==':' && zVarname[1]==':' ){
+    zOuter += 2;
+    nOuter -= 2;
+    isGlobal = 1;
+  }
+
+  /* Check if this is an array reference. */
+  if( zOuter[nOuter-1]==')' ){
+    for(i=0; i<nOuter; i++){
+      if( zOuter[i]=='(' ){
+        zInner = &zOuter[i+1];
+        nInner = nOuter-i-2;
+        nOuter = i;
+        break;
+      }
+    }
+  }
+
+  *pzOuter = zOuter;
+  *pnOuter = nOuter;
+  *pzInner = zInner;
+  *pnInner = nInner;
+  *pisGlobal = isGlobal;
+  return TH_OK;
+}
+
+/*
+** Input string (zVar, nVar) contains a variable name. This function locates
+** the Th_Variable structure associated with the named variable. The
+** variable name may be a global or local scalar or array variable
+**
+** If the create argument is non-zero and the named variable does not exist
+** it is created. Otherwise, an error is left in the interpreter result
+** and NULL returned.
+**
+** If the arrayok argument is false and the named variable is an array,
+** an error is left in the interpreter result and NULL returned. If
+** arrayok is true an array name is Ok.
+*/
+static Th_Variable *thFindValue(
+  Th_Interp *interp,
+  const uchar *zVar,     /* Pointer to variable name */
+  int nVar,              /* Number of bytes at nVar */
+  int create,            /* If true, create the variable if not found */
+  int arrayok            /* If true, an array is Ok. Othewise array==error */
+){
+  const uchar *zOuter;
+  int nOuter;
+  const uchar *zInner;
+  int nInner;
+  int isGlobal;
+
+  Th_HashEntry *pEntry;
+  Th_Frame *pFrame = interp->pFrame;
+  Th_Variable *pValue;
+
+  thAnalyseVarname(zVar, nVar, &zOuter, &nOuter, &zInner, &nInner, &isGlobal);
+  if( isGlobal ){
+    while( pFrame->pCaller ) pFrame = pFrame->pCaller;
+  }
+
+  pEntry = Th_HashFind(interp, pFrame->paVar, zOuter, nOuter, create);
+  assert(pEntry || !create);
+  if( !pEntry ){
+    goto no_such_var;
+  }
+
+  pValue = (Th_Variable *)pEntry->pData;
+  if( !pValue ){
+    assert(create);
+    pValue = Th_Malloc(interp, sizeof(Th_Variable));
+    pValue->nRef = 1;
+    pEntry->pData = (void *)pValue;
+  }
+
+  if( zInner ){
+    if( pValue->zData ){
+      Th_ErrorMessage(interp, "variable is a scalar:", zOuter, nOuter);
+      return 0;
+    }
+    if( !pValue->pHash ){
+      if( !create ){
+        goto no_such_var;
+      }
+      pValue->pHash = Th_HashNew(interp);
+    }
+    pEntry = Th_HashFind(interp, pValue->pHash, zInner, nInner, create);
+    if( !pEntry ){
+      goto no_such_var;
+    }
+    pValue = (Th_Variable *)pEntry->pData;
+    if( !pValue ){
+      assert(create);
+      pValue = Th_Malloc(interp, sizeof(Th_Variable));
+      pValue->nRef = 1;
+      pEntry->pData = (void *)pValue;
+    }
+  }else{
+    if( pValue->pHash && !arrayok ){
+      Th_ErrorMessage(interp, "variable is an array:", zOuter, nOuter);
+      return 0;
+    }
+  }
+
+  return pValue;
+
+no_such_var:
+  Th_ErrorMessage(interp, "no such variable:", zVar, nVar);
+  return 0;
+}
+
+/*
+** String (zVar, nVar) must contain the name of a scalar variable or
+** array member. Look up the variable, store its current value in
+** the interpreter result and return TH_OK.
+**
+** If the named variable does not exist, return TH_ERROR and leave
+** an error message in the interpreter result.
+*/
+int Th_GetVar(Th_Interp *interp, const uchar *zVar, int nVar){
+  Th_Variable *pValue;
+
+  pValue = thFindValue(interp, zVar, nVar, 0, 0);
+  if( !pValue ){
+    return TH_ERROR;
+  }
+  if( !pValue->zData ){
+    Th_ErrorMessage(interp, "no such variable:", zVar, nVar);
+    return TH_ERROR;
+  }
+
+  return Th_SetResult(interp, pValue->zData, pValue->nData);
+}
+
+/*
+** String (zVar, nVar) must contain the name of a scalar variable or
+** array member. If the variable does not exist it is created. The
+** variable is set to the value supplied in string (zValue, nValue).
+**
+** If (zVar, nVar) refers to an existing array, TH_ERROR is returned
+** and an error message left in the interpreter result.
+*/
+int Th_SetVar(
+  Th_Interp *interp,
+  const uchar *zVar,
+  int nVar,
+  const uchar *zValue,
+  int nValue
+){
+  Th_Variable *pValue;
+
+  pValue = thFindValue(interp, zVar, nVar, 1, 0);
+  if( !pValue ){
+    return TH_ERROR;
+  }
+
+  if( nValue<0 ){
+    nValue = th_strlen(zValue);
+  }
+  if( pValue->zData ){
+    Th_Free(interp, pValue->zData);
+    pValue->zData = 0;
+  }
+
+  assert(zValue || nValue==0);
+  pValue->zData = Th_Malloc(interp, nValue+1);
+  pValue->zData[nValue] = '\0';
+  memcpy(pValue->zData, zValue, nValue);
+  pValue->nData = nValue;
+
+  return TH_OK;
+}
+
+/*
+** Create a variable link so that accessing variable (zLocal, nLocal) is
+** the same as accessing variable (zLink, nLink) in stack frame iFrame.
+*/
+int Th_LinkVar(
+  Th_Interp *interp,                 /* Interpreter */
+  const uchar *zLocal, int nLocal,   /* Local varname */
+  int iFrame,                        /* Stack frame of linked var */
+  const uchar *zLink, int nLink      /* Linked varname */
+){
+  Th_Frame *pSavedFrame = interp->pFrame;
+  Th_Frame *pFrame;
+  Th_HashEntry *pEntry;
+  Th_Variable *pValue;
+
+  pFrame = getFrame(interp, iFrame);
+  if( !pFrame ){
+    return TH_ERROR;
+  }
+  pSavedFrame = interp->pFrame;
+  interp->pFrame = pFrame;
+  pValue = thFindValue(interp, zLink, nLink, 1, 1);
+  interp->pFrame = pSavedFrame;
+
+  pEntry = Th_HashFind(interp, interp->pFrame->paVar, zLocal, nLocal, 1);
+  if( pEntry->pData ){
+    Th_ErrorMessage(interp, "variable exists:", zLocal, nLocal);
+    return TH_ERROR;
+  }
+  pEntry->pData = (void *)pValue;
+  pValue->nRef++;
+
+  return TH_OK;
+}
+
+/*
+** Input string (zVar, nVar) must contain the name of a scalar variable,
+** an array, or an array member. If the identified variable exists, it
+** is deleted and TH_OK returned. Otherwise, an error message is left
+** in the interpreter result and TH_ERROR is returned.
+*/
+int Th_UnsetVar(Th_Interp *interp, const uchar *zVar, int nVar){
+  Th_Variable *pValue;
+
+  pValue = thFindValue(interp, zVar, nVar, 1, 1);
+  if( !pValue ){
+    return TH_ERROR;
+  }
+
+  Th_Free(interp, pValue->zData);
+  pValue->zData = 0;
+  if( pValue->pHash ){
+    Th_HashIterate(interp, pValue->pHash, thFreeVariable, (void *)interp);
+    Th_HashDelete(interp, pValue->pHash);
+    pValue->pHash = 0;
+  }
+  return TH_OK;
+}
+
+/*
+** Return an allocated buffer containing a copy of string (z, n). The
+** caller is responsible for eventually calling Th_Free() to free
+** the returned buffer.
+*/
+uchar *th_strdup(Th_Interp *interp, const uchar *z, int n){
+  uchar *zRes;
+  if( n<0 ){
+    n = th_strlen(z);
+  }
+  zRes = Th_Malloc(interp, n+1);
+  memcpy(zRes, z, n);
+  zRes[n] = '\0';
+  return zRes;
+}
+
+/*
+** Argument zPre must be a nul-terminated string. Set the interpreter
+** result to a string containing the contents of zPre, followed by
+** a space (" ") character, followed by a copy of string (z, n).
+**
+** In other words, the equivalent of:
+*
+**     printf("%s %.*s", zPre, n, z);
+**
+** Example:
+**
+**     Th_ErrorMessage(interp, "no such variable:", zVarname, nVarname);
+**
+*/
+int Th_ErrorMessage(Th_Interp *interp, const char *zPre, const uchar *z, int n){
+  if( interp ){
+    uchar *zRes = 0;
+    int nRes = 0;
+    int nPre = th_strlen(zPre);
+
+    Th_SetVar(interp, (uchar *)"::th_stack_trace", -1, 0, 0);
+
+    Th_StringAppend(interp, &zRes, &nRes, zPre, -1);
+    if( zRes[nRes-1]=='"' ){
+      Th_StringAppend(interp, &zRes, &nRes, z, n);
+      Th_StringAppend(interp, &zRes, &nRes, (const uchar *)"\"", 1);
+    }else{
+      Th_StringAppend(interp, &zRes, &nRes, (const uchar *)" ", 1);
+      Th_StringAppend(interp, &zRes, &nRes, z, n);
+    }
+
+    Th_SetResult(interp, zRes, nRes);
+    Th_Free(interp, zRes);
+  }
+
+  return TH_OK;
+}
+
+/*
+** Set the current interpreter result by taking a copy of the buffer
+** pointed to by z, size n bytes. TH_OK is always returned.
+*/
+int Th_SetResult(Th_Interp *pInterp, const uchar *z, int n){
+
+  /* Free the current result */
+  Th_Free(pInterp, pInterp->zResult);
+  pInterp->zResult = 0;
+  pInterp->nResult = 0;
+
+  if( n<0 ){
+    n = th_strlen(z);
+  }
+
+  if( z && n>0 ){
+    uchar *zResult;
+    zResult = Th_Malloc(pInterp, n+1);
+    memcpy(zResult, z, n);
+    zResult[n] = '\0';
+    pInterp->zResult = zResult;
+    pInterp->nResult = n;
+  }
+
+  return TH_OK;
+}
+
+/*
+** Return a pointer to the buffer containing the current interpreter
+** result. If pN is not NULL, set *pN to the size of the returned
+** buffer.
+*/
+const uchar *Th_GetResult(Th_Interp *pInterp, int *pN){
+  assert(pInterp->zResult || pInterp->nResult==0);
+  if( pN ){
+    *pN = pInterp->nResult;
+  }
+  return (pInterp->zResult ? pInterp->zResult : (const uchar *)"");
+}
+
+/*
+** Return a pointer to the buffer containing the current interpreter
+** result. If pN is not NULL, set *pN to the size of the returned
+** buffer.
+**
+** This function is the same as Th_GetResult() except that the
+** caller is responsible for eventually calling Th_Free() on the
+** returned buffer. The internal interpreter result is cleared
+** after this function is called.
+*/
+uchar *Th_TakeResult(Th_Interp *pInterp, int *pN){
+  if( pN ){
+    *pN = pInterp->nResult;
+  }
+  if( pInterp->zResult ){
+    uchar *zResult = pInterp->zResult;
+    pInterp->zResult = 0;
+    pInterp->nResult = 0;
+    return zResult;
+  }else{
+    return (uchar *)Th_Malloc(pInterp, 1);
+  }
+}
+
+
+/*
+** Wrappers around the supplied malloc() and free()
+*/
+void *Th_Malloc(Th_Interp *pInterp, int nByte){
+  void *p = pInterp->pVtab->xMalloc(nByte);
+  if( p ){
+    memset(p, 0, nByte);
+  }
+  return p;
+}
+void Th_Free(Th_Interp *pInterp, void *z){
+  if( z ){
+    pInterp->pVtab->xFree(z);
+  }
+}
+
+/*
+** Install a new th1 command.
+**
+** If a command of the same name already exists, it is deleted automatically.
+*/
+int Th_CreateCommand(
+  Th_Interp *interp,
+  const char *zName,                 /* New command name */
+  Th_CommandProc xProc,              /* Command callback proc */
+  void *pContext,                    /* Value to pass as second arg to xProc */
+  void (*xDel)(Th_Interp *, void *)  /* Command destructor callback */
+){
+  Th_HashEntry *pEntry;
+  Th_Command *pCommand;
+
+  pEntry = Th_HashFind(interp, interp->paCmd, (const uchar *)zName, -1, 1);
+  if( pEntry->pData ){
+    pCommand = pEntry->pData;
+    if( pCommand->xDel ){
+      pCommand->xDel(interp, pCommand->pContext);
+    }
+  }else{
+    pCommand = Th_Malloc(interp, sizeof(Th_Command));
+  }
+  pCommand->xProc = xProc;
+  pCommand->pContext = pContext;
+  pCommand->xDel = xDel;
+  pEntry->pData = (void *)pCommand;
+
+  return TH_OK;
+}
+
+/*
+** Rename the existing command (zName, nName) to (zNew, nNew). If nNew is 0,
+** the command is deleted instead of renamed.
+**
+** If successful, TH_OK is returned. If command zName does not exist, or
+** if command zNew already exists, an error message is left in the
+** interpreter result and TH_ERROR is returned.
+*/
+int Th_RenameCommand(
+  Th_Interp *interp,
+  const uchar *zName,            /* Existing command name */
+  int nName,                     /* Number of bytes at zName */
+  const uchar *zNew,             /* New command name */
+  int nNew                       /* Number of bytes at zNew */
+){
+  Th_HashEntry *pEntry;
+  Th_HashEntry *pNewEntry;
+
+  pEntry = Th_HashFind(interp, interp->paCmd, zName, nName, 0);
+  if( !pEntry ){
+    Th_ErrorMessage(interp, "no such command:", zName, nName);
+    return TH_ERROR;
+  }
+  assert(pEntry->pData);
+
+  if( nNew>0 ){
+    pNewEntry = Th_HashFind(interp, interp->paCmd, zNew, nNew, 1);
+    if( pNewEntry->pData ){
+      Th_ErrorMessage(interp, "command exists:", zNew, nNew);
+      return TH_ERROR;
+    }
+    pNewEntry->pData = pEntry->pData;
+  }else{
+    Th_Command *pCommand = (Th_Command *)(pEntry->pData);
+    if( pCommand->xDel ){
+      pCommand->xDel(interp, pCommand->pContext);
+    }
+    Th_Free(interp, pCommand);
+  }
+
+  Th_HashFind(interp, interp->paCmd, zName, nName, -1);
+  return TH_OK;
+}
+
+/*
+** Push a stack frame onto the interpreter stack, invoke the
+** callback, and pop the frame back off again. See the implementation
+** of [proc] (th_lang.c) for an example.
+*/
+int Th_InFrame(Th_Interp *interp,
+  int (*xCall)(Th_Interp *, void *pContext1, void *pContext2),
+  void *pContext1,
+  void *pContext2
+){
+  Th_Frame frame;
+  int rc;
+  thPushFrame(interp, &frame);
+  rc = xCall(interp, pContext1, pContext2);
+  thPopFrame(interp);
+  return rc;
+}
+
+/*
+** Split a th1 list into its component elements. The list to split is
+** passed via arguments (zList, nList). If successful, TH_OK is returned.
+** If an error occurs (if (zList, nList) is not a valid list) an error
+** message is left in the interpreter result and TH_ERROR returned.
+**
+** If successful, *pnCount is set to the number of elements in the list.
+** panElem is set to point at an array of *pnCount integers - the lengths
+** of the element values. *pazElem is set to point at an array of
+** pointers to buffers containing the array element's data.
+**
+** To free the arrays allocated at *pazElem and *panElem, the caller
+** should call Th_Free() on *pazElem only. Exactly one such call to
+** Th_Free() must be made per call to Th_SplitList().
+**
+** Example:
+**
+**     int nElem;
+**     int *anElem;
+**     uchar **azElem;
+**     int i;
+**
+**     Th_SplitList(interp, zList, nList, &azElem, &anElem, &nElem);
+**     for(i=0; i<nElem; i++){
+**       int nData = anElem[i];
+**       uchar *zData = azElem[i];
+**       ...
+**     }
+**
+**     Th_Free(interp, azElem);
+**
+*/
+int Th_SplitList(
+  Th_Interp *interp,
+  const uchar *zList,             /* Pointer to buffer containing list */
+  int nList,                      /* Number of bytes at zList */
+  uchar ***pazElem,               /* OUT: Array of pointers to element data */
+  int **panElem,                  /* OUT: Array of element data lengths */
+  int *pnCount                    /* OUT: Number of elements in list */
+){
+  int rc;
+  interp->isListMode = 1;
+  rc = thSplitList(interp, zList, nList, pazElem, panElem, pnCount);
+  interp->isListMode = 0;
+  if( rc ){
+    Th_ErrorMessage(interp, "Expected list, got: \"", zList, nList);
+  }
+  return rc;
+}
+
+/*
+** Append a new element to an existing th1 list. The element to append
+** to the list is (zElem, nElem).
+**
+** A pointer to the existing list must be stored at *pzList when this
+** function is called. The length must be stored in *pnList. The value
+** of *pzList must either be NULL (in which case *pnList must be 0), or
+** a pointer to memory obtained from Th_Malloc().
+**
+** This function calls Th_Free() to free the buffer at *pzList and sets
+** *pzList to point to a new buffer containing the new list value. *pnList
+** is similarly updated before returning. The return value is always TH_OK.
+**
+** Example:
+**
+**     uchar *zList = 0;
+**     int nList = 0;
+**     for (...) {
+**       uchar *zElem = <some expression>;
+**       Th_ListAppend(interp, &zList, &nList, zElem, -1);
+**     }
+**     Th_SetResult(interp, zList, nList);
+**     Th_Free(interp, zList);
+**
+*/
+int Th_ListAppend(
+  Th_Interp *interp,           /* Interpreter context */
+  uchar **pzList,              /* IN/OUT: Ptr to ptr to list */
+  int *pnList,                 /* IN/OUT: Current length of *pzList */
+  const uchar *zElem,          /* Data to append */
+  int nElem                    /* Length of nElem */
+){
+  Buffer output;
+  int i;
+
+  int hasSpecialChar = 0;
+  int hasEscapeChar = 0;
+  int nBrace = 0;
+
+  output.zBuf = *pzList;
+  output.nBuf = *pnList;
+  output.nBufAlloc = output.nBuf;
+
+  if( nElem<0 ){
+    nElem = th_strlen(zElem);
+  }
+  if( output.nBuf>0 ){
+    thBufferWrite(interp, &output, " ", 1);
+  }
+
+  for(i=0; i<nElem; i++){
+    uchar c = zElem[i];
+    if( th_isspecial(c) ) hasSpecialChar = 1;
+    if( c=='\\' ) hasEscapeChar = 1;
+    if( c=='{' ) nBrace++;
+    if( c=='}' ) nBrace--;
+  }
+
+  if( nElem==0 || (!hasEscapeChar && hasSpecialChar && nBrace==0) ){
+    thBufferWrite(interp, &output, "{", 1);
+    thBufferWrite(interp, &output, zElem, nElem);
+    thBufferWrite(interp, &output, "}", 1);
+  }else{
+    for(i=0; i<nElem; i++){
+      uchar c = zElem[i];
+      if( th_isspecial(c) ) thBufferWrite(interp, &output, "\\", 1);
+      thBufferWrite(interp, &output, &c, 1);
+    }
+  }
+
+  *pzList = output.zBuf;
+  *pnList = output.nBuf;
+
+  return TH_OK;
+}
+
+/*
+** Append a new element to an existing th1 string. This function uses
+** the same interface as the Th_ListAppend() function.
+*/
+int Th_StringAppend(
+  Th_Interp *interp,           /* Interpreter context */
+  uchar **pzStr,               /* IN/OUT: Ptr to ptr to list */
+  int *pnStr,                  /* IN/OUT: Current length of *pzStr */
+  const uchar *zElem,          /* Data to append */
+  int nElem                    /* Length of nElem */
+){
+  uchar *zNew;
+  int nNew;
+
+  if( nElem<0 ){
+    nElem = th_strlen(zElem);
+  }
+
+  nNew = *pnStr + nElem;
+  zNew = Th_Malloc(interp, nNew);
+  memcpy(zNew, *pzStr, *pnStr);
+  memcpy(&zNew[*pnStr], zElem, nElem);
+
+  Th_Free(interp, *pzStr);
+  *pzStr = zNew;
+  *pnStr = nNew;
+
+  return TH_OK;
+}
+
+/*
+** Delete an interpreter.
+*/
+void Th_DeleteInterp(Th_Interp *interp){
+  assert(interp->pFrame);
+  assert(0==interp->pFrame->pCaller);
+
+  /* Delete the contents of the global frame. */
+  thPopFrame(interp);
+
+  /* Delete any result currently stored in the interpreter. */
+  Th_SetResult(interp, 0, 0);
+
+  /* Delete all registered commands and the command hash-table itself. */
+  Th_HashIterate(interp, interp->paCmd, thFreeCommand, (void *)interp);
+  Th_HashDelete(interp, interp->paCmd);
+
+  /* Delete the interpreter structure itself. */
+  Th_Free(interp, (void *)interp);
+}
+
+/*
+** Create a new interpreter.
+*/
+Th_Interp * Th_CreateInterp(Th_Vtab *pVtab){
+  Th_Interp *p;
+
+  /* Allocate and initialise the interpreter and the global frame */
+  p = pVtab->xMalloc(sizeof(Th_Interp) + sizeof(Th_Frame));
+  memset(p, 0, sizeof(Th_Interp));
+  p->pVtab = pVtab;
+  p->paCmd = Th_HashNew(p);
+  thPushFrame(p, (Th_Frame *)&p[1]);
+
+  return p;
+}
+
+/*
+** These two types are used only by the expression module, where
+** the expression module means the Th_Expr() and exprXXX() functions.
+*/
+typedef struct Operator Operator;
+struct Operator {
+  const char *zOp;
+  int eOp;
+  int iPrecedence;
+  int eArgType;
+};
+typedef struct Expr Expr;
+struct Expr {
+  Operator *pOp;
+  Expr *pParent;
+  Expr *pLeft;
+  Expr *pRight;
+
+  uchar *zValue;     /* Pointer to literal value */
+  int nValue;        /* Length of literal value buffer */
+};
+
+/* Unary operators */
+#define OP_UNARY_MINUS  2
+#define OP_UNARY_PLUS   3
+#define OP_BITWISE_NOT  4
+#define OP_LOGICAL_NOT  5
+
+/* Binary operators */
+#define OP_MULTIPLY     6
+#define OP_DIVIDE       7
+#define OP_MODULUS      8
+#define OP_ADD          9
+#define OP_SUBTRACT    10
+#define OP_LEFTSHIFT   11
+#define OP_RIGHTSHIFT  12
+#define OP_LT          13
+#define OP_GT          14
+#define OP_LE          15
+#define OP_GE          16
+#define OP_EQ          17
+#define OP_NE          18
+#define OP_SEQ         19
+#define OP_SNE         20
+#define OP_BITWISE_AND 21
+#define OP_BITWISE_XOR 22
+#define OP_BITWISE_OR  24
+#define OP_LOGICAL_AND 25
+#define OP_LOGICAL_OR  26
+
+/* Other symbols */
+#define OP_OPEN_BRACKET  27
+#define OP_CLOSE_BRACKET 28
+
+/* Argument types. Each operator in the expression syntax is defined
+** as requiring either integer, number (real or integer) or string
+** operands.
+*/
+#define ARG_INTEGER 1
+#define ARG_NUMBER  2
+#define ARG_STRING  3
+
+static Operator aOperator[] = {
+
+  {"(",  OP_OPEN_BRACKET,   -1, 0},
+  {")",  OP_CLOSE_BRACKET, -1, 0},
+
+  /* Note: all unary operators have (iPrecedence==1) */
+  {"-",  OP_UNARY_MINUS,    1, ARG_NUMBER},
+  {"+",  OP_UNARY_PLUS,     1, ARG_NUMBER},
+  {"~",  OP_BITWISE_NOT,    1, ARG_INTEGER},
+  {"!",  OP_LOGICAL_NOT,    1, ARG_INTEGER},
+
+  /* Binary operators. It is important to the parsing in Th_Expr() that
+   * the two-character symbols ("==") appear before the one-character
+   * ones ("="). And that the priorities of all binary operators are
+   * integers between 2 and 12.
+   */
+  {"<<", OP_LEFTSHIFT,      4, ARG_INTEGER},
+  {">>", OP_RIGHTSHIFT,     4, ARG_INTEGER},
+  {"<=", OP_LE,             5, ARG_NUMBER},
+  {">=", OP_GE,             5, ARG_NUMBER},
+  {"==", OP_EQ,             6, ARG_NUMBER},
+  {"!=", OP_NE,             6, ARG_NUMBER},
+  {"eq", OP_SEQ,            7, ARG_STRING},
+  {"ne", OP_SNE,            7, ARG_STRING},
+  {"&&", OP_LOGICAL_AND,   11, ARG_INTEGER},
+  {"||", OP_LOGICAL_OR,    12, ARG_INTEGER},
+
+  {"*",  OP_MULTIPLY,       2, ARG_NUMBER},
+  {"/",  OP_DIVIDE,         2, ARG_NUMBER},
+  {"%",  OP_MODULUS,        2, ARG_INTEGER},
+  {"+",  OP_ADD,            3, ARG_NUMBER},
+  {"-",  OP_SUBTRACT,       3, ARG_NUMBER},
+  {"<",  OP_LT,             5, ARG_NUMBER},
+  {">",  OP_GT,             5, ARG_NUMBER},
+  {"&",  OP_BITWISE_AND,    8, ARG_INTEGER},
+  {"^",  OP_BITWISE_XOR,    9, ARG_INTEGER},
+  {"|",  OP_BITWISE_OR,    10, ARG_INTEGER},
+
+  {0,0,0}
+};
+
+/*
+** The first part of the string (zInput,nInput) contains a number.
+** Set *pnVarname to the number of bytes in the numeric string.
+*/
+static int thNextNumber(
+  Th_Interp *interp,
+  const uchar *zInput,
+  int nInput,
+  int *pnLiteral
+){
+  int i;
+  int seenDot = 0;
+  for(i=0; i<nInput; i++){
+    uchar c = zInput[i];
+    if( (seenDot || c!='.') && !th_isdigit(c) ) break;
+    if( c=='.' ) seenDot = 1;
+  }
+  *pnLiteral = i;
+  return TH_OK;
+}
+
+/*
+** Free an expression tree.
+*/
+static void exprFree(Th_Interp *interp, Expr *pExpr){
+  if( pExpr ){
+    exprFree(interp, pExpr->pLeft);
+    exprFree(interp, pExpr->pRight);
+    Th_Free(interp, pExpr->zValue);
+    Th_Free(interp, pExpr);
+  }
+}
+
+/*
+** Evaluate an expression tree.
+*/
+static int exprEval(Th_Interp *interp, Expr *pExpr){
+  int rc = TH_OK;
+
+  if( pExpr->pOp==0 ){
+    /* A literal */
+    rc = thSubstWord(interp, pExpr->zValue, pExpr->nValue);
+  }else{
+    int eArgType;           /* Actual type of arguments */
+
+    /* Argument values */
+    int iLeft;
+    int iRight;
+    double fLeft;
+    double fRight;
+
+    /* Left and right arguments as strings */
+    uchar *zLeft = 0; int nLeft;
+    uchar *zRight = 0; int nRight;
+
+    /* Evaluate left and right arguments, if they exist. */
+    if( pExpr->pLeft ){
+      rc = exprEval(interp, pExpr->pLeft);
+      if( rc==TH_OK ){
+        zLeft = Th_TakeResult(interp, &nLeft);
+      }
+    }
+    if( rc==TH_OK && pExpr->pRight ){
+      rc = exprEval(interp, pExpr->pRight);
+      if( rc==TH_OK ){
+        zRight = Th_TakeResult(interp, &nRight);
+      }
+    }
+
+    /* Convert arguments to their required forms. */
+    if( rc==TH_OK ){
+      eArgType = pExpr->pOp->eArgType;
+      if( eArgType==ARG_NUMBER ){
+        if( (zLeft==0 || TH_OK==Th_ToInt(0, zLeft, nLeft, &iLeft))
+         && (zRight==0 || TH_OK==Th_ToInt(0, zRight, nRight, &iRight))
+        ){
+          eArgType = ARG_INTEGER;
+        }else if(
+          (zLeft && TH_OK!=Th_ToDouble(interp, zLeft, nLeft, &fLeft)) ||
+          (zRight && TH_OK!=Th_ToDouble(interp, zRight, nRight, &fRight))
+        ){
+          /* A type error. */
+          rc = TH_ERROR;
+        }
+      }else if( eArgType==ARG_INTEGER ){
+        rc = Th_ToInt(interp, zLeft, nLeft, &iLeft);
+        if( rc==TH_OK && zRight ){
+          rc = Th_ToInt(interp, zRight, nRight, &iRight);
+        }
+      }
+    }
+
+    if( rc==TH_OK && eArgType==ARG_INTEGER ){
+      int iRes;
+      switch( pExpr->pOp->eOp ) {
+        case OP_MULTIPLY:     iRes = iLeft*iRight;  break;
+        case OP_DIVIDE:       iRes = iLeft/iRight;  break;
+        case OP_MODULUS:      iRes = iLeft%iRight;  break;
+        case OP_ADD:          iRes = iLeft+iRight;  break;
+        case OP_SUBTRACT:     iRes = iLeft-iRight;  break;
+        case OP_LEFTSHIFT:    iRes = iLeft<<iRight; break;
+        case OP_RIGHTSHIFT:   iRes = iLeft>>iRight; break;
+        case OP_LT:           iRes = iLeft<iRight;  break;
+        case OP_GT:           iRes = iLeft>iRight;  break;
+        case OP_LE:           iRes = iLeft<=iRight; break;
+        case OP_GE:           iRes = iLeft>=iRight; break;
+        case OP_EQ:           iRes = iLeft==iRight; break;
+        case OP_NE:           iRes = iLeft!=iRight; break;
+        case OP_BITWISE_AND:  iRes = iLeft&iRight;  break;
+        case OP_BITWISE_XOR:  iRes = iLeft^iRight;  break;
+        case OP_BITWISE_OR:   iRes = iLeft|iRight;  break;
+        case OP_LOGICAL_AND:  iRes = iLeft&&iRight; break;
+        case OP_LOGICAL_OR:   iRes = iLeft||iRight; break;
+        case OP_UNARY_MINUS:  iRes = -iLeft;        break;
+        case OP_UNARY_PLUS:   iRes = +iLeft;        break;
+        case OP_LOGICAL_NOT:  iRes = !iLeft;        break;
+        default: assert(!"Internal error");
+      }
+      Th_SetResultInt(interp, iRes);
+    }else if( rc==TH_OK && eArgType==ARG_NUMBER ){
+      switch( pExpr->pOp->eOp ) {
+        case OP_MULTIPLY: Th_SetResultDouble(interp, fLeft*fRight);  break;
+        case OP_DIVIDE:   Th_SetResultDouble(interp, fLeft/fRight);  break;
+        case OP_ADD:      Th_SetResultDouble(interp, fLeft+fRight);  break;
+        case OP_SUBTRACT: Th_SetResultDouble(interp, fLeft-fRight);  break;
+        case OP_LT:       Th_SetResultInt(interp, fLeft<fRight);  break;
+        case OP_GT:       Th_SetResultInt(interp, fLeft>fRight);  break;
+        case OP_LE:       Th_SetResultInt(interp, fLeft<=fRight); break;
+        case OP_GE:       Th_SetResultInt(interp, fLeft>=fRight); break;
+        case OP_EQ:       Th_SetResultInt(interp, fLeft==fRight); break;
+        case OP_NE:       Th_SetResultInt(interp, fLeft!=fRight); break;
+        default: assert(!"Internal error");
+      }
+    }else if( rc==TH_OK ){
+      int iEqual = 0;
+      assert( eArgType==ARG_STRING );
+      if( nRight==nLeft && 0==memcmp(zRight, zLeft, nRight) ){
+        iEqual = 1;
+      }
+      switch( pExpr->pOp->eOp ) {
+        case OP_SEQ:       Th_SetResultInt(interp, iEqual); break;
+        case OP_SNE:       Th_SetResultInt(interp, !iEqual); break;
+        default: assert(!"Internal error");
+      }
+    }
+
+    Th_Free(interp, zLeft);
+    Th_Free(interp, zRight);
+  }
+
+  return rc;
+}
+
+/*
+** Create an expression tree from an array of tokens. If successful,
+** the root of the tree is stored in apToken[0].
+*/
+int exprMakeTree(Th_Interp *interp, Expr **apToken, int nToken){
+  int iLeft;
+  int i;
+  int jj;
+
+  assert(nToken>0);
+#define ISTERM(x) (apToken[x] && (!apToken[x]->pOp || apToken[x]->pLeft))
+
+  for(jj=0; jj<nToken; jj++){
+    if( apToken[jj]->pOp && apToken[jj]->pOp->eOp==OP_OPEN_BRACKET ){
+      int nNest = 1;
+      int iLeft = jj;
+
+      for(jj++; jj<nToken; jj++){
+        Operator *pOp = apToken[jj]->pOp;
+        if( pOp && pOp->eOp==OP_OPEN_BRACKET ) nNest++;
+        if( pOp && pOp->eOp==OP_CLOSE_BRACKET ) nNest--;
+        if( nNest==0 ) break;
+      }
+      if( jj==nToken ){
+        return TH_ERROR;
+      }
+      if( (jj-iLeft)>1 ){
+        if( exprMakeTree(interp, &apToken[iLeft+1], jj-iLeft-1) ){
+          return TH_ERROR;
+        }
+        exprFree(interp, apToken[jj]);
+        exprFree(interp, apToken[iLeft]);
+        apToken[jj] = 0;
+        apToken[iLeft] = 0;
+      }
+    }
+  }
+
+  iLeft = 0;
+  for(jj=nToken-1; jj>=0; jj--){
+    if( apToken[jj] ){
+      if( apToken[jj]->pOp && apToken[jj]->pOp->iPrecedence==1 && iLeft>0 ){
+        apToken[jj]->pLeft = apToken[iLeft];
+        apToken[jj]->pLeft->pParent = apToken[jj];
+        apToken[iLeft] = 0;
+      }
+      iLeft = jj;
+    }
+  }
+  for(i=2; i<=12; i++){
+    iLeft = -1;
+    for(jj=0; jj<nToken; jj++){
+      Expr *pToken = apToken[jj];
+      if( apToken[jj] ){
+        if( pToken->pOp && !pToken->pLeft && pToken->pOp->iPrecedence==i ){
+          int iRight = jj+1;
+
+          iRight = jj+1;
+          for(iRight=jj+1; !apToken[iRight] && iRight<nToken; iRight++);
+          if( iRight==nToken || iLeft<0 || !ISTERM(iRight) || !ISTERM(iLeft) ){
+            return TH_ERROR;
+          }
+          pToken->pLeft = apToken[iLeft];
+          apToken[iLeft] = 0;
+          pToken->pLeft->pParent = pToken;
+          pToken->pRight = apToken[iRight];
+          apToken[iRight] = 0;
+          pToken->pRight->pParent = pToken;
+        }
+        iLeft = jj;
+      }
+    }
+  }
+  for(jj=1; jj<nToken; jj++){
+    assert( !apToken[jj] || !apToken[0] );
+    if( apToken[jj] ){
+      apToken[0] = apToken[jj];
+      apToken[jj] = 0;
+    }
+  }
+
+  return TH_OK;
+}
+
+/*
+** Parse a string containing a TH expression to a list of tokens.
+*/
+static int exprParse(
+  Th_Interp *interp,        /* Interpreter to leave error message in */
+  const uchar *zExpr,       /* Pointer to input string */
+  int nExpr,                /* Number of bytes at zExpr */
+  Expr ***papToken,         /* OUT: Array of tokens. */
+  int *pnToken              /* OUT: Size of token array */
+){
+  int i;
+
+  int rc = TH_OK;
+  int nToken = 0;
+  Expr **apToken = 0;
+
+  for(i=0; rc==TH_OK && i<nExpr; ){
+    uchar c = zExpr[i];
+    if( th_isspace(c) ){                                /* White-space     */
+      i++;
+    }else{
+      Expr *pNew = (Expr *)Th_Malloc(interp, sizeof(Expr));
+      const uchar *z = &zExpr[i];
+
+      switch (c) {
+        case '0': case '1': case '2': case '3': case '4':
+        case '5': case '6': case '7': case '8': case '9':
+          thNextNumber(interp, z, nExpr-i, &pNew->nValue);
+          break;
+
+        case '$':
+          thNextVarname(interp, z, nExpr-i, &pNew->nValue);
+          break;
+
+        case '{': case '[': {
+          thNextCommand(interp, z, nExpr-i, &pNew->nValue);
+          break;
+        }
+
+        case '"': {
+          int iEnd = i;
+          while( ++iEnd<nExpr && zExpr[iEnd]!='"' ){
+            if( zExpr[iEnd]=='\\' ) iEnd++;
+          }
+          if( iEnd<nExpr ){
+            pNew->nValue = iEnd+1-i;
+          }
+          break;
+        }
+
+        default: {
+          int j;
+          for(j=0; aOperator[j].zOp; j++){
+            int nOp;
+            if( aOperator[j].iPrecedence==1 && nToken>0 ){
+              Expr *pPrev = apToken[nToken-1];
+              if( !pPrev->pOp || pPrev->pOp->eOp==OP_CLOSE_BRACKET ){
+                continue;
+              }
+            }
+            nOp = th_strlen((const uchar *)aOperator[j].zOp);
+            if( (nExpr-i)>=nOp && 0==memcmp(aOperator[j].zOp, &zExpr[i], nOp) ){
+              pNew->pOp = &aOperator[j];
+              i += nOp;
+              break;
+            }
+          }
+        }
+      }
+
+      if( pNew->pOp || pNew->nValue ){
+        if( pNew->nValue ){
+          /* A terminal. Copy the string value. */
+          assert( !pNew->pOp );
+          pNew->zValue = Th_Malloc(interp, pNew->nValue);
+          memcpy(pNew->zValue, z, pNew->nValue);
+          i += pNew->nValue;
+        }
+        if( (nToken%16)==0 ){
+          /* Grow the apToken array. */
+          Expr **apTokenOld = apToken;
+          apToken = Th_Malloc(interp, sizeof(Expr *)*(nToken+16));
+          memcpy(apToken, apTokenOld, sizeof(Expr *)*nToken);
+        }
+
+        /* Put the new token at the end of the apToken array */
+        apToken[nToken] = pNew;
+        nToken++;
+      }else{
+        Th_Free(interp, pNew);
+        rc = TH_ERROR;
+      }
+    }
+  }
+
+  *papToken = apToken;
+  *pnToken = nToken;
+  return rc;
+}
+
+/*
+** Evaluate the string (zExpr, nExpr) as a Th expression. Store
+** the result in the interpreter interp and return TH_OK if
+** successful. If an error occurs, store an error message in
+** the interpreter result and return an error code.
+*/
+int Th_Expr(Th_Interp *interp, const uchar *zExpr, int nExpr){
+  int rc;                           /* Return Code */
+  int i;                            /* Loop counter */
+
+  int nToken = 0;
+  Expr **apToken = 0;
+
+  if( nExpr<0 ){
+    nExpr = th_strlen(zExpr);
+  }
+
+  /* Parse the expression to a list of tokens. */
+  rc = exprParse(interp, zExpr, nExpr, &apToken, &nToken);
+
+  /* If the parsing was successful, create an expression tree from
+  ** the parsed list of tokens. If successful, apToken[0] is set
+  ** to point to the root of the expression tree.
+  */
+  if( rc==TH_OK ){
+    rc = exprMakeTree(interp, apToken, nToken);
+  }
+
+  if( rc!=TH_OK ){
+    Th_ErrorMessage(interp, "syntax error in expression: \"", zExpr, nExpr);
+  }
+
+  /* Evaluate the expression tree. */
+  if( rc==TH_OK ){
+    rc = exprEval(interp, apToken[0]);
+  }
+
+  /* Free memory allocated by exprParse(). */
+  for(i=0; i<nToken; i++){
+    exprFree(interp, apToken[i]);
+  }
+  Th_Free(interp, apToken);
+
+  return rc;
+}
+
+/*
+** Allocate and return a pointer to a new hash-table. The caller should
+** (eventually) delete the hash-table by passing it to Th_HashDelete().
+*/
+Th_Hash *Th_HashNew(Th_Interp *interp){
+  Th_Hash *p;
+  p = Th_Malloc(interp, sizeof(Th_Hash));
+  return p;
+}
+
+/*
+** Iterate through all values currently stored in the hash table. Invoke
+** the callback function xCallback for each entry. The second argument
+** passed to xCallback is a copy of the fourth argument passed to this
+** function.
+*/
+void Th_HashIterate(
+  Th_Interp *interp,
+  Th_Hash *pHash,
+  void (*xCallback)(Th_HashEntry *pEntry, void *pContext),
+  void *pContext
+){
+  int i;
+  for(i=0; i<TH_HASHSIZE; i++){
+    Th_HashEntry *pEntry;
+    Th_HashEntry *pNext;
+    for(pEntry=pHash->a[i]; pEntry; pEntry=pNext){
+      pNext = pEntry->pNext;
+      xCallback(pEntry, pContext);
+    }
+  }
+}
+
+/*
+** Helper function for Th_HashDelete().
+*/
+static void xFreeHashEntry(Th_HashEntry *pEntry, void *pContext){
+  Th_Free((Th_Interp *)pContext, (void *)pEntry);
+}
+
+/*
+** Free a hash-table previously allocated by Th_HashNew().
+*/
+void Th_HashDelete(Th_Interp *interp, Th_Hash *pHash){
+  if( pHash ){
+    Th_HashIterate(interp, pHash, xFreeHashEntry, (void *)interp);
+    Th_Free(interp, pHash);
+  }
+}
+
+/*
+** This function is used to insert or delete hash table items, or to
+** query a hash table for an existing item.
+**
+** If parameter op is less than zero, then the hash-table element
+** identified by (zKey, nKey) is removed from the hash-table if it
+** exists. NULL is returned.
+**
+** Otherwise, if the hash-table contains an item with key (zKey, nKey),
+** a pointer to the associated Th_HashEntry is returned. If parameter
+** op is greater than zero, then a new entry is added if one cannot
+** be found. If op is zero, then NULL is returned if the item is
+** not already present in the hash-table.
+*/
+Th_HashEntry *Th_HashFind(
+  Th_Interp *interp,
+  Th_Hash *pHash,
+  const uchar *zKey,
+  int nKey,
+  int op                      /* -ve = delete, 0 = find, +ve = insert */
+){
+  unsigned int iKey = 0;
+  int i;
+  Th_HashEntry *pRet;
+  Th_HashEntry **ppRet;
+
+  if( nKey<0 ){
+    nKey = th_strlen(zKey);
+  }
+
+  for(i=0; i<nKey; i++){
+    iKey = (iKey<<3) ^ iKey ^ zKey[i];
+  }
+  iKey = iKey % TH_HASHSIZE;
+
+  for(ppRet=&pHash->a[iKey]; (pRet=*ppRet); ppRet=&pRet->pNext){
+    assert( pRet && ppRet && *ppRet==pRet );
+    if( pRet->nKey==nKey && 0==memcmp(pRet->zKey, zKey, nKey) ) break;
+  }
+
+  if( op<0 && pRet ){
+    assert( ppRet && *ppRet==pRet );
+    *ppRet = pRet->pNext;
+    Th_Free(interp, pRet);
+    pRet = 0;
+  }
+
+  if( op>0 && !pRet ){
+    pRet = (Th_HashEntry *)Th_Malloc(interp, sizeof(Th_HashEntry) + nKey);
+    pRet->zKey = (uchar *)&pRet[1];
+    pRet->nKey = nKey;
+    memcpy(pRet->zKey, zKey, nKey);
+    pRet->pNext = pHash->a[iKey];
+    pHash->a[iKey] = pRet;
+  }
+
+  return pRet;
+}
+
+/*
+** This function is the same as the standard strlen() function, except
+** that it returns 0 (instead of being undefined) if the argument is
+** a null pointer.
+*/
+int th_strlen(const unsigned char *zStr){
+  int n = 0;
+  if( zStr ){
+    while( zStr[n] ) n++;
+  }
+  return n;
+}
+
+/* Whitespace characters:
+**
+**     ' '    0x20
+**     '\t'   0x09
+**     '\n'   0x0A
+**     '\v'   0x0B
+**     '\f'   0x0C
+**     '\r'   0x0D
+**
+** Whitespace characters have the 0x01 flag set. Decimal digits have the
+** 0x2 flag set. Single byte printable characters have the 0x4 flag set.
+** Alphabet characters have the 0x8 bit set.
+**
+** The special list characters have the 0x10 flag set
+**
+**    { } [ ] \ ; ' "
+**
+**    " 0x22
+**
+*/
+static unsigned char aCharProp[256] = {
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  1,  1,  1,  1,  1,  0,  0,   /* 0x0. */
+  0,  0,  1,  1,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0x1. */
+  5,  4, 20,  4,  4,  4,  4,  4,     4,  4,  4,  4,  4,  4,  4,  4,   /* 0x2. */
+  6,  6,  6,  6,  6,  6,  6,  6,     6,  6,  4, 20,  4,  4,  4,  4,   /* 0x3. */
+  4, 12, 12, 12, 12, 12, 12, 12,    12, 12, 12, 12, 12, 12, 12, 12,   /* 0x4. */
+ 12, 12, 12, 12, 12, 12, 12, 12,    12, 12, 12, 20, 20, 20,  4,  4,   /* 0x5. */
+  4, 12, 12, 12, 12, 12, 12, 12,    12, 12, 12, 12, 12, 12, 12, 12,   /* 0x6. */
+ 12, 12, 12, 12, 12, 12, 12, 12,    12, 12, 12, 20,  4, 20,  4,  4,   /* 0x7. */
+
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0x8. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0x9. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0xA. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0xB. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0xC. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0xD. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0,   /* 0xE. */
+  0,  0,  0,  0,  0,  0,  0,  0,     0,  0,  0,  0,  0,  0,  0,  0    /* 0xF. */
+};
+
+/*
+** Clone of the standard isspace() and isdigit function/macros.
+*/
+int th_isspace(unsigned char c){
+  return (aCharProp[c] & 0x01);
+}
+int th_isdigit(unsigned char c){
+  return (aCharProp[c] & 0x02);
+}
+int th_isspecial(unsigned char c){
+  return (aCharProp[c] & 0x11);
+}
+int th_isalnum(unsigned char c){
+  return (aCharProp[c] & 0x0A);
+}
+
+#ifndef LONGDOUBLE_TYPE
+# define LONGDOUBLE_TYPE long double
+#endif
+typedef uchar u8;
+
+
+/*
+** Return TRUE if z is a pure numeric string.  Return FALSE if the
+** string contains any character which is not part of a number. If
+** the string is numeric and contains the '.' character, set *realnum
+** to TRUE (otherwise FALSE).
+**
+** An empty string is considered non-numeric.
+*/
+static int sqlite3IsNumber(const char *z, int *realnum){
+  int incr = 1;
+  if( *z=='-' || *z=='+' ) z += incr;
+  if( !th_isdigit(*(u8*)z) ){
+    return 0;
+  }
+  z += incr;
+  if( realnum ) *realnum = 0;
+  while( th_isdigit(*(u8*)z) ){ z += incr; }
+  if( *z=='.' ){
+    z += incr;
+    if( !th_isdigit(*(u8*)z) ) return 0;
+    while( th_isdigit(*(u8*)z) ){ z += incr; }
+    if( realnum ) *realnum = 1;
+  }
+  if( *z=='e' || *z=='E' ){
+    z += incr;
+    if( *z=='+' || *z=='-' ) z += incr;
+    if( !th_isdigit(*(u8*)z) ) return 0;
+    while( th_isdigit(*(u8*)z) ){ z += incr; }
+    if( realnum ) *realnum = 1;
+  }
+  return *z==0;
+}
+
+/*
+** The string z[] is an ascii representation of a real number.
+** Convert this string to a double.
+**
+** This routine assumes that z[] really is a valid number.  If it
+** is not, the result is undefined.
+**
+** This routine is used instead of the library atof() function because
+** the library atof() might want to use "," as the decimal point instead
+** of "." depending on how locale is set.  But that would cause problems
+** for SQL.  So this routine always uses "." regardless of locale.
+*/
+static int sqlite3AtoF(const char *z, double *pResult){
+  int sign = 1;
+  const char *zBegin = z;
+  LONGDOUBLE_TYPE v1 = 0.0;
+  while( th_isspace(*(u8*)z) ) z++;
+  if( *z=='-' ){
+    sign = -1;
+    z++;
+  }else if( *z=='+' ){
+    z++;
+  }
+  while( th_isdigit(*(u8*)z) ){
+    v1 = v1*10.0 + (*z - '0');
+    z++;
+  }
+  if( *z=='.' ){
+    LONGDOUBLE_TYPE divisor = 1.0;
+    z++;
+    while( th_isdigit(*(u8*)z) ){
+      v1 = v1*10.0 + (*z - '0');
+      divisor *= 10.0;
+      z++;
+    }
+    v1 /= divisor;
+  }
+  if( *z=='e' || *z=='E' ){
+    int esign = 1;
+    int eval = 0;
+    LONGDOUBLE_TYPE scale = 1.0;
+    z++;
+    if( *z=='-' ){
+      esign = -1;
+      z++;
+    }else if( *z=='+' ){
+      z++;
+    }
+    while( th_isdigit(*(u8*)z) ){
+      eval = eval*10 + *z - '0';
+      z++;
+    }
+    while( eval>=64 ){ scale *= 1.0e+64; eval -= 64; }
+    while( eval>=16 ){ scale *= 1.0e+16; eval -= 16; }
+    while( eval>=4 ){ scale *= 1.0e+4; eval -= 4; }
+    while( eval>=1 ){ scale *= 1.0e+1; eval -= 1; }
+    if( esign<0 ){
+      v1 /= scale;
+    }else{
+      v1 *= scale;
+    }
+  }
+  *pResult = sign<0 ? -v1 : v1;
+  return z - zBegin;
+}
+
+/*
+** Try to convert the string passed as arguments (z, n) to an integer.
+** If successful, store the result in *piOut and return TH_OK.
+**
+** If the string cannot be converted to an integer, return TH_ERROR.
+** If the interp argument is not NULL, leave an error message in the
+** interpreter result too.
+*/
+int Th_ToInt(Th_Interp *interp, const uchar *z, int n, int *piOut){
+  int i = 0;
+  int iOut = 0;
+
+  if( n<0 ){
+    n = th_strlen(z);
+  }
+
+  if( n>0 && (z[0]=='-' || z[0]=='+') ){
+    i = 1;
+  }
+  for(; i<n; i++){
+    if( !th_isdigit(z[i]) ){
+      Th_ErrorMessage(interp, "expected integer, got: \"", z, n);
+      return TH_ERROR;
+    }
+    iOut = iOut * 10 + (z[i] - 48);
+  }
+
+  if( n>0 && z[0]=='-' ){
+    iOut *= -1;
+  }
+
+  *piOut = iOut;
+  return TH_OK;
+}
+
+/*
+** Try to convert the string passed as arguments (z, n) to a double.
+** If successful, store the result in *pfOut and return TH_OK.
+**
+** If the string cannot be converted to a double, return TH_ERROR.
+** If the interp argument is not NULL, leave an error message in the
+** interpreter result too.
+*/
+int Th_ToDouble(
+  Th_Interp *interp,
+  const uchar *z,
+  int n,
+  double *pfOut
+){
+  if( !sqlite3IsNumber((const char *)z, 0) ){
+    Th_ErrorMessage(interp, "expected number, got: \"", z, n);
+    return TH_ERROR;
+  }
+
+  sqlite3AtoF((const char *)z, pfOut);
+  return TH_OK;
+}
+
+/*
+** Set the result of the interpreter to the th1 representation of
+** the integer iVal and return TH_OK.
+*/
+int Th_SetResultInt(Th_Interp *interp, int iVal){
+  int isNegative = 0;
+  uchar zBuf[32];
+  uchar *z = &zBuf[32];
+
+  if( iVal<0 ){
+    isNegative = 1;
+    iVal = iVal * -1;
+  }
+  *(--z) = '\0';
+  *(--z) = (uchar)(48+(iVal%10));
+  while( (iVal = (iVal/10))>0 ){
+    *(--z) = (uchar)(48+(iVal%10));
+    assert(z>zBuf);
+  }
+  if( isNegative ){
+    *(--z) = '-';
+  }
+
+  return Th_SetResult(interp, z, -1);
+}
+
+/*
+** Set the result of the interpreter to the th1 representation of
+** the double fVal and return TH_OK.
+*/
+int Th_SetResultDouble(Th_Interp *interp, double fVal){
+  int i;                /* Iterator variable */
+  double v = fVal;      /* Input value */
+  uchar zBuf[128];      /* Output buffer */
+  uchar *z = zBuf;      /* Output cursor */
+  int iDot = 0;         /* Digit after which to place decimal point */
+  int iExp = 0;         /* Exponent (NN in eNN) */
+  const uchar *zExp;    /* String representation of iExp */
+
+  /* Precision: */
+  #define INSIGNIFICANT 0.000000000001
+  #define ROUNDER       0.0000000000005
+  double insignificant = INSIGNIFICANT;
+
+  /* If the real value is negative, write a '-' character to the
+   * output and transform v to the corresponding positive number.
+   */
+  if( v<0.0 ){
+    *z++ = '-';
+    v *= -1.0;
+  }
+
+  /* Normalize v to a value between 1.0 and 10.0. Integer
+   * variable iExp is set to the exponent. i.e the original
+   * value is (v * 10^iExp) (or the negative thereof).
+   */
+  if( v>0.0 ){
+    while( (v+ROUNDER)>=10.0 ) { iExp++; v *= 0.1; }
+    while( (v+ROUNDER)<1.0 )   { iExp--; v *= 10.0; }
+  }
+  v += ROUNDER;
+
+  /* For a small (<12) positive exponent, move the decimal point
+   * instead of using the "eXX" notation.
+   */
+  if( iExp>0 && iExp<12 ){
+    iDot = iExp;
+    iExp = 0;
+  }
+
+  /* For a small (>-4) negative exponent, write leading zeroes
+   * instead of using the "eXX" notation.
+   */
+  if( iExp<0 && iExp>-4 ){
+    *z++ = '0';
+    *z++ = '.';
+    for(i=0; i>(iExp+1); i--){
+      *z++ = '0';
+    }
+    iDot = -1;
+    iExp = 0;
+  }
+
+  /* Output the digits in real value v. The value of iDot determines
+   * where (if at all) the decimal point is placed.
+   */
+  for(i=0; i<=(iDot+1) || v>=insignificant; i++){
+    *z++ = (uchar)(48 + (int)v);
+    v = (v - ((double)(int)v)) * 10.0;
+    insignificant *= 10.0;
+    if( iDot==i ){
+      *z++ = '.';
+    }
+  }
+
+  /* If the exponent is not zero, add the "eXX" notation to the
+   * end of the string.
+   */
+  if( iExp!=0 ){
+    *z++ = 'e';
+    Th_SetResultInt(interp, iExp);
+    zExp = Th_GetResult(interp, 0);
+    for(i=0; zExp[i]; i++){
+      *z++ = zExp[i];
+    }
+  }
+
+  *z = '\0';
+  return Th_SetResult(interp, zBuf, -1);
+}
+
+/*
+** Set the result of the interpreter to the th1 representation of
+** the pointer p and return TH_OK. The th1 representation can be
+** converted back to a pointer using Th_ToPtr().
+*/
+int Th_SetResultPtr(Th_Interp *interp, void *p){
+  char zBuf[32];
+  char *z;
+  int i;
+  unsigned int v = (unsigned int)p;
+
+  const char zHex[16] = "0123456789ABCDEF";
+
+  assert( sizeof(unsigned int)==sizeof(void *) );
+
+  zBuf[31] = '\0';
+  z = &zBuf[30];
+
+  for(i=0; i<(sizeof(unsigned int)*2); i++){
+    *z-- = zHex[(v&0x0000000F)];
+    v = v>>4;
+  }
+
+  *z-- = 'x';
+  *z = '0';
+
+  return Th_SetResult(interp, (uchar *)z, -1);
+}
+
+/*
+** Convert input string (z, n) to a generic pointer. If the conversion
+** is successful, store the result in *pp and return TH_OK.
+**
+** If the string cannot be converted to a pointer, return TH_ERROR.
+** If the interp argument is not NULL, leave an error message in the
+** interpreter result too.
+*/
+int Th_ToPtr(Th_Interp *interp, const uchar *z, int n, void **pp){
+  unsigned int iPtr;
+  int i;
+  assert(sizeof(unsigned int)==sizeof(void *));
+
+  if( n<3 || z[0]!='0' || z[1]!='x' ){
+    goto error_out;
+  }
+
+  iPtr = 0;
+  for(i=2; i<n; i++){
+    int digit = thHexdigit(z[i]);
+    if( digit<0 ){
+      goto error_out;
+    }
+    iPtr = (iPtr<<4) + digit;
+  }
+
+  *pp = (void *)iPtr;
+  return TH_OK;
+
+error_out:
+  Th_ErrorMessage(interp, "expected pointer, got: \"", z, n);
+  return TH_ERROR;
+}
 

Added src/th.h version [bbcc39a9d6]

@@ -1,1 +1,192 @@
+
+/* This header file defines the external interface to the custom Scripting
+** Language (TH) interpreter used to create test cases for SQLiteRT. The
+** interpreted language and API are both based on Tcl.
+*/
+
+#ifndef __TH_H
+#define __TH_H
+
+typedef unsigned char uchar;
+
+/*
+** Before creating an interpreter, the application must allocate and
+** populate an instance of the following structure. It must remain valid
+** for the lifetime of the interpreter.
+*/
+struct Th_Vtab {
+  void *(*xMalloc)(unsigned int);
+  void (*xFree)(void *);
+};
+typedef struct Th_Vtab Th_Vtab;
+
+/*
+** Opaque handle for interpeter.
+*/
+typedef struct Th_Interp Th_Interp;
+
+/*
+** Create and delete interpreters.
+*/
+Th_Interp * Th_CreateInterp(Th_Vtab *pVtab);
+void Th_DeleteInterp(Th_Interp *);
+
+/*
+** Evaluate an TH program in the stack frame identified by parameter
+** iFrame, according to the following rules:
+**
+**   * If iFrame is 0, this means the current frame.
+**
+**   * If iFrame is negative, then the nth frame up the stack, where n is
+**     the absolute value of iFrame. A value of -1 means the calling
+**     procedure.
+**
+**   * If iFrame is +ve, then the nth frame from the bottom of the stack.
+**     An iFrame value of 1 means the toplevel (global) frame.
+*/
+int Th_Eval(Th_Interp *interp, int iFrame, const uchar *zProg, int nProg);
+
+/*
+** Evaluate a TH expression. The result is stored in the
+** interpreter result.
+*/
+int Th_Expr(Th_Interp *interp, const uchar *, int);
+
+/*
+** Access TH variables in the current stack frame. If the variable name
+** begins with "::", the lookup is in the top level (global) frame.
+*/
+int Th_GetVar(Th_Interp *, const uchar *, int);
+int Th_SetVar(Th_Interp *, const uchar *, int, const uchar *, int);
+int Th_LinkVar(Th_Interp *, const uchar *, int, int, const uchar *, int);
+int Th_UnsetVar(Th_Interp *, const uchar *, int);
+
+typedef int (*Th_CommandProc)(Th_Interp *, void *, int, const uchar **, int *);
+
+/*
+** Register new commands.
+*/
+int Th_CreateCommand(
+  Th_Interp *interp,
+  const char *zName,
+  /* int (*xProc)(Th_Interp *, void *, int, const uchar **, int *), */
+  Th_CommandProc xProc,
+  void *pContext,
+  void (*xDel)(Th_Interp *, void *)
+);
+
+/*
+** Delete or rename commands.
+*/
+int Th_RenameCommand(Th_Interp *, const uchar *, int, const uchar *, int);
+
+/*
+** Push a new stack frame (local variable context) onto the interpreter
+** stack, call the function supplied as parameter xCall with the two
+** context arguments,
+**
+**   xCall(interp, pContext1, pContext2)
+**
+** , then pop the frame off of the interpreter stack. The value returned
+** by the xCall() function is returned as the result of this function.
+**
+** This is intended for use by the implementation of commands such as
+** those created by [proc].
+*/
+int Th_InFrame(Th_Interp *interp,
+  int (*xCall)(Th_Interp *, void *pContext1, void *pContext2),
+  void *pContext1,
+  void *pContext2
+);
+
+/*
+** Valid return codes for xProc callbacks.
+*/
+#define TH_OK       0
+#define TH_ERROR    1
+#define TH_BREAK    2
+#define TH_RETURN   3
+#define TH_CONTINUE 4
+
+/*
+** Set and get the interpreter result.
+*/
+int Th_SetResult(Th_Interp *, const uchar *, int);
+const uchar *Th_GetResult(Th_Interp *, int *);
+uchar *Th_TakeResult(Th_Interp *, int *);
+
+/*
+** Set an error message as the interpreter result. This also
+** sets the global stack-trace variable $::th_stack_trace.
+*/
+int Th_ErrorMessage(Th_Interp *, const char *, const uchar *, int);
+
+/*
+** Access the memory management functions associated with the specified
+** interpreter.
+*/
+void *Th_Malloc(Th_Interp *, int);
+void Th_Free(Th_Interp *, void *);
+
+/*
+** Functions for handling TH lists.
+*/
+int Th_ListAppend(Th_Interp *, uchar **, int *, const uchar *, int);
+int Th_SplitList(Th_Interp *, const uchar *, int, uchar ***, int **, int *);
+
+int Th_StringAppend(Th_Interp *, uchar **, int *, const uchar *, int);
+
+/*
+** Functions for handling numbers and pointers.
+*/
+int Th_ToInt(Th_Interp *, const uchar *, int, int *);
+int Th_ToDouble(Th_Interp *, const uchar *, int, double *);
+int Th_ToPtr(Th_Interp *, const uchar *, int, void **);
+int Th_SetResultInt(Th_Interp *, int);
+int Th_SetResultDouble(Th_Interp *, double);
+int Th_SetResultPtr(Th_Interp *, void *);
+
+/*
+** Drop in replacements for the corresponding standard library functions.
+*/
+int th_strlen(const unsigned char *);
+int th_isdigit(unsigned char);
+int th_isspace(unsigned char);
+int th_isalnum(unsigned char);
+int th_isspecial(unsigned char);
+uchar *th_strdup(Th_Interp *interp, const uchar *z, int n);
+
+/*
+** Interfaces to register the language extensions.
+*/
+int th_register_language(Th_Interp *interp);            /* th_lang.c */
+int th_register_sqlite(Th_Interp *interp);              /* th_sqlite.c */
+int th_register_vfs(Th_Interp *interp);                 /* th_vfs.c */
+int th_register_testvfs(Th_Interp *interp);             /* th_testvfs.c */
+
+/*
+** General purpose hash table from th_lang.c.
+*/
+typedef struct Th_Hash      Th_Hash;
+typedef struct Th_HashEntry Th_HashEntry;
+struct Th_HashEntry {
+  void *pData;
+  uchar *zKey;
+  int nKey;
+  Th_HashEntry *pNext;     /* Internal use only */
+};
+Th_Hash *Th_HashNew(Th_Interp *);
+void Th_HashDelete(Th_Interp *, Th_Hash *);
+void Th_HashIterate(Th_Interp*,Th_Hash*,void (*x)(Th_HashEntry*, void*),void*);
+Th_HashEntry *Th_HashFind(Th_Interp*, Th_Hash*, const uchar*, int, int);
+
+/*
+** Useful functions from th_lang.c.
+*/
+int Th_WrongNumArgs(Th_Interp *interp, const char *zMsg);
+
+typedef struct Th_SubCommand {char *zName; Th_CommandProc xProc;} Th_SubCommand;
+int Th_CallSubCommand(Th_Interp*,void*,int,const uchar**,int*,Th_SubCommand*);
+
+#endif /* ifndef __TH_H */
 

Added src/th_lang.c version [1db6c88ca5]

@@ -1,1 +1,1071 @@
 
+/*
+** This file contains the implementation of all of the TH language
+** built-in commands.
+**
+** All built-in commands are implemented using the public interface
+** declared in th.h, so this file serves as both a part of the language
+** implementation and an example of how to extend the language with
+** new commands.
+*/
+
+#include "th.h"
+#include <string.h>
+#include <assert.h>
+
+int Th_WrongNumArgs(Th_Interp *interp, const char *zMsg){
+  Th_ErrorMessage(interp,
+      "wrong # args: should be \"", (const uchar*)zMsg, -1
+  );
+  return TH_ERROR;
+}
+
+/*
+** Syntax:
+**
+**   catch script ?varname?
+*/
+static int catch_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int rc;
+
+  if( argc!=2 && argc!=3 ){
+    return Th_WrongNumArgs(interp, "catch script ?varname?");
+  }
+
+  rc = Th_Eval(interp, 0, argv[1], -1);
+  if( argc==3 ){
+    int nResult;
+    const uchar *zResult = Th_GetResult(interp, &nResult);
+    Th_SetVar(interp, argv[2], argl[2], zResult, nResult);
+  }
+
+  Th_SetResultInt(interp, rc);
+  return TH_OK;
+}
+
+/*
+** TH Syntax:
+**
+**   if expr1 body1 ?elseif expr2 body2? ? ?else? bodyN?
+*/
+static int if_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int rc = TH_OK;
+
+  int iCond;           /* Result of evaluating expression */
+  int i;
+
+  const uchar *zResult;
+  int nResult;
+
+  if( argc<3 ){
+    goto wrong_args;
+  }
+
+  for(i=0; i<argc && rc==TH_OK; i+=3){
+    if( i>argc-3 ){
+      i = argc-3;
+      iCond = 1;
+    }else{
+      if( TH_OK!=Th_Expr(interp, argv[i+1], argl[i+1]) ){
+        return TH_ERROR;
+      }
+      zResult = Th_GetResult(interp, &nResult);
+      rc = Th_ToInt(interp, zResult, nResult, &iCond);
+    }
+    if( iCond && rc==TH_OK ){
+      rc = Th_Eval(interp, 0, argv[i+2], -1);
+      break;
+    }
+  }
+
+  return rc;
+
+wrong_args:
+  return Th_WrongNumArgs(interp, "if ...");
+}
+
+/*
+** TH Syntax:
+**
+**   expr expr
+*/
+static int expr_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  if( argc!=2 ){
+    return Th_WrongNumArgs(interp, "expr expression");
+  }
+
+  return Th_Expr(interp, argv[1], argl[1]);
+}
+
+/*
+** Evaluate the th1 script (zBody, nBody) in the local stack frame.
+** Return the result of the evaluation, except if the result
+** is TH_CONTINUE, return TH_OK instead.
+*/
+static int eval_loopbody(Th_Interp *interp, const uchar *zBody, int nBody){
+  int rc = Th_Eval(interp, 0, zBody, nBody);
+  if( rc==TH_CONTINUE ){
+    rc = TH_OK;
+  }
+  return rc;
+}
+
+/*
+** TH Syntax:
+**
+**   for init condition incr script
+*/
+static int for_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int rc;
+  int iCond;
+
+  if( argc!=5 ){
+    return Th_WrongNumArgs(interp, "for init condition incr script");
+  }
+
+  /* Evaluate the 'init' script */
+  rc = Th_Eval(interp, 0, argv[1], -1);
+
+  while( rc==TH_OK
+     && TH_OK==(rc = Th_Expr(interp, argv[2], -1))
+     && TH_OK==(rc = Th_ToInt(interp, Th_GetResult(interp, 0), -1, &iCond))
+     && iCond
+     && TH_OK==(rc = eval_loopbody(interp, argv[4], argl[4]))
+  ){
+    rc = Th_Eval(interp, 0, argv[3], -1);
+  }
+
+  if( rc==TH_BREAK ) rc = TH_OK;
+  return rc;
+}
+
+/*
+** TH Syntax:
+**
+**   list ?arg1 ?arg2? ...?
+*/
+static int list_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  uchar *zList = 0;
+  int nList = 0;
+  int i;
+
+  for(i=1; i<argc; i++){
+    Th_ListAppend(interp, &zList, &nList, argv[i], argl[i]);
+  }
+
+  Th_SetResult(interp, zList, nList);
+  Th_Free(interp, zList);
+
+  return TH_OK;
+}
+
+/*
+** TH Syntax:
+**
+**   lindex list index
+*/
+static int lindex_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int iElem;
+  int rc;
+
+  uchar **azElem;
+  int *anElem;
+  int nCount;
+
+  if( argc!=3 ){
+    return Th_WrongNumArgs(interp, "lindex list index");
+  }
+
+  if( TH_OK!=Th_ToInt(interp, argv[2], argl[2], &iElem) ){
+    return TH_ERROR;
+  }
+
+  rc = Th_SplitList(interp, argv[1], argl[1], &azElem, &anElem, &nCount);
+  if( rc==TH_OK ){
+    if( iElem<nCount && iElem>=0 ){
+      Th_SetResult(interp, azElem[iElem], anElem[iElem]);
+    }else{
+      Th_SetResult(interp, 0, 0);
+    }
+    Th_Free(interp, azElem);
+  }
+
+  return rc;
+}
+
+/*
+** TH Syntax:
+**
+**   llength list
+*/
+static int llength_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int nElem;
+  int rc;
+
+  if( argc!=2 ){
+    return Th_WrongNumArgs(interp, "llength list");
+  }
+
+  rc = Th_SplitList(interp, argv[1], argl[1], 0, 0, &nElem);
+  if( rc==TH_OK ){
+    Th_SetResultInt(interp, nElem);
+  }
+
+  return rc;
+}
+
+/*
+** TH Syntax:
+**
+**   set varname ?value?
+*/
+static int set_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  if( argc!=2 && argc!=3 ){
+    return Th_WrongNumArgs(interp, "set varname ?value?");
+  }
+
+  if( argc==3 ){
+    Th_SetVar(interp, argv[1], argl[1], argv[2], argl[2]);
+  }
+  return Th_GetVar(interp, argv[1], argl[1]);
+}
+
+/*
+** When a new command is created using the built-in [proc] command, an
+** instance of the following structure is allocated and populated. A
+** pointer to the structure is passed as the context (second) argument
+** to function proc_call1() when the new command is executed.
+*/
+typedef struct ProcDefn ProcDefn;
+struct ProcDefn {
+  int nParam;                /* Number of formal (non "args") parameters */
+  uchar **azParam;           /* Parameter names */
+  int *anParam;              /* Lengths of parameter names */
+  uchar **azDefault;         /* Default values */
+  int *anDefault;            /* Lengths of default values */
+  int hasArgs;               /* True if there is an "args" parameter */
+  uchar *zProgram;           /* Body of proc */
+  int nProgram;              /* Number of bytes at zProgram */
+  uchar *zUsage;             /* Usage message */
+  int nUsage;                /* Number of bytes at zUsage */
+};
+
+/* This structure is used to temporarily store arguments passed to an
+** invocation of a command created using [proc]. A pointer to an
+** instance is passed as the second argument to the proc_call2() function.
+*/
+typedef struct ProcArgs ProcArgs;
+struct ProcArgs {
+  int argc;
+  const uchar **argv;
+  int *argl;
+};
+
+/*
+** Each time a command created using [proc] is invoked, a new
+** th1 stack frame is allocated (for the proc's local variables) and
+** this function invoked.
+**
+** Argument pContext1 points to the associated ProcDefn structure.
+** Argument pContext2  points to a ProcArgs structure that contains
+** the arguments passed to this specific invocation of the proc.
+*/
+static int proc_call2(Th_Interp *interp, void *pContext1, void *pContext2){
+  int i;
+  ProcDefn *p = (ProcDefn *)pContext1;
+  ProcArgs *pArgs = (ProcArgs *)pContext2;
+
+  /* Check if there are the right number of arguments. If there are
+  ** not, generate a usage message for the command.
+  */
+  if( (pArgs->argc>(p->nParam+1) && !p->hasArgs)
+   || (pArgs->argc<=(p->nParam) && !p->azDefault[pArgs->argc-1])
+  ){
+    uchar *zUsage = 0;
+    int nUsage = 0;
+    Th_StringAppend(interp, &zUsage, &nUsage, pArgs->argv[0], pArgs->argl[0]);
+    Th_StringAppend(interp, &zUsage, &nUsage, p->zUsage, p->nUsage);
+    Th_StringAppend(interp, &zUsage, &nUsage, (const uchar *)"", 1);
+    Th_WrongNumArgs(interp, zUsage);
+    Th_Free(interp, zUsage);
+    return TH_ERROR;
+  }
+
+  /* Populate the formal proc parameters. */
+  for(i=0; i<p->nParam; i++){
+    const uchar *zVal;
+    int nVal;
+    if( pArgs->argc>(i+1) ){
+      zVal = pArgs->argv[i+1];
+      nVal = pArgs->argl[i+1];
+    }else{
+      zVal = p->azDefault[i];
+      nVal = p->anDefault[i];
+    }
+    Th_SetVar(interp, p->azParam[i], p->anParam[i], zVal, nVal);
+  }
+
+  /* Populate the "args" parameter, if it exists */
+  if( p->hasArgs ){
+    uchar *zArgs = 0;
+    int nArgs = 0;
+    for(i=p->nParam+1; i<pArgs->argc; i++){
+      Th_ListAppend(interp, &zArgs, &nArgs, pArgs->argv[i], pArgs->argl[i]);
+    }
+    Th_SetVar(interp, (const uchar *)"args", -1, zArgs, nArgs);
+  }
+
+  Th_SetResult(interp, 0, 0);
+  return Th_Eval(interp, 0, p->zProgram, p->nProgram);
+}
+
+/*
+** This function is the command callback registered for all commands
+** created using the [proc] command. The second argument, pContext,
+** is a pointer to the associated ProcDefn structure.
+*/
+static int proc_call1(
+  Th_Interp *interp,
+  void *pContext,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int rc;
+
+  ProcDefn *p = (ProcDefn *)pContext;
+  ProcArgs procargs;
+
+  /* Call function proc_call2(), which will call Th_Eval() to evaluate
+  ** the body of the [proc], in a new Th stack frame. This is so that
+  ** the proc body has its own local variable context.
+  */
+  procargs.argc = argc;
+  procargs.argv = argv;
+  procargs.argl = argl;
+  rc = Th_InFrame(interp, proc_call2, (void *)p, (void *)&procargs);
+
+  if( rc==TH_RETURN ){
+    rc = TH_OK;
+  }
+  return rc;
+}
+
+/*
+** This function is registered as the delete callback for all commands
+** created using the built-in [proc] command. It is called automatically
+** when a command created using [proc] is deleted.
+**
+** It frees the ProcDefn structure allocated when the command was created.
+*/
+static void proc_del(Th_Interp *interp, void *pContext){
+  ProcDefn *p = (ProcDefn *)pContext;
+  Th_Free(interp, (void *)p->zUsage);
+  Th_Free(interp, (void *)p);
+}
+
+/*
+** TH Syntax:
+**
+**   proc name arglist code
+*/
+static int proc_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int rc;
+  char *zName;
+
+  ProcDefn *p;
+  int nByte;
+  int i;
+  uchar *zSpace;
+
+  uchar **azParam;
+  int *anParam;
+  int nParam;
+
+  uchar *zUsage = 0;               /* Build up a usage message here */
+  int nUsage = 0;                  /* Number of bytes at zUsage */
+
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "proc name arglist code");
+  }
+  if( Th_SplitList(interp, argv[2], argl[2], &azParam, &anParam, &nParam) ){
+    return TH_ERROR;
+  }
+
+  /* Allocate the new ProcDefn structure. */
+  nByte = sizeof(ProcDefn) +                        /* ProcDefn structure */
+      (sizeof(uchar *) + sizeof(int)) * nParam +    /* azParam, anParam */
+      (sizeof(uchar *) + sizeof(int)) * nParam +    /* azDefault, anDefault */
+      argl[3] +                                     /* zProgram */
+      argl[2];     /* Space for copies of parameter names and default values */
+  p = (ProcDefn *)Th_Malloc(interp, nByte);
+
+  /* If the last parameter in the parameter list is "args", then set the
+  ** ProcDefn.hasArgs flag. The "args" parameter does not require an
+  ** entry in the ProcDefn.azParam[] or ProcDefn.azDefault[] arrays.
+  */
+  if( anParam[nParam-1]==4 && 0==memcmp(azParam[nParam-1], "args", 4) ){
+    p->hasArgs = 1;
+    nParam--;
+  }
+
+  p->nParam    = nParam;
+  p->azParam   = (uchar **)&p[1];
+  p->anParam   = (int *)&p->azParam[nParam];
+  p->azDefault = (uchar **)&p->anParam[nParam];
+  p->anDefault = (int *)&p->azDefault[nParam];
+  p->zProgram = (uchar *)&p->anDefault[nParam];
+  memcpy(p->zProgram, argv[3], argl[3]);
+  p->nProgram = argl[3];
+  zSpace = &p->zProgram[p->nProgram];
+
+  for(i=0; i<nParam; i++){
+    uchar **az;
+    int *an;
+    int n;
+    if( Th_SplitList(interp, azParam[i], anParam[i], &az, &an, &n) ){
+      goto error_out;
+    }
+    if( n<1 || n>2 ){
+      const char expected[] = "expected parameter, got \"";
+      Th_ErrorMessage(interp, expected, azParam[i], anParam[i]);
+      Th_Free(interp, az);
+      goto error_out;
+    }
+    p->anParam[i] = an[0];
+    p->azParam[i] = zSpace;
+    memcpy(zSpace, az[0], an[0]);
+    zSpace += an[0];
+    if( n==2 ){
+      p->anDefault[i] = an[1];
+      p->azDefault[i] = zSpace;
+      memcpy(zSpace, az[1], an[1]);
+      zSpace += an[1];
+    }
+
+    Th_StringAppend(interp, &zUsage, &nUsage, (const uchar *)" ", 1);
+    if( n==2 ){
+      Th_StringAppend(interp, &zUsage, &nUsage, (const uchar *)"?", 1);
+      Th_StringAppend(interp, &zUsage, &nUsage, az[0], an[0]);
+      Th_StringAppend(interp, &zUsage, &nUsage, (const uchar *)"?", 1);
+    }else{
+      Th_StringAppend(interp, &zUsage, &nUsage, az[0], an[0]);
+    }
+
+    Th_Free(interp, az);
+  }
+  assert( zSpace-(uchar *)p<=nByte );
+
+  /* If there is an "args" parameter, append it to the end of the usage
+  ** message. Set ProcDefn.zUsage to point at the usage message. It will
+  ** be freed along with the rest of the proc-definition by proc_del().
+  */
+  if( p->hasArgs ){
+    Th_StringAppend(interp, &zUsage, &nUsage, (const uchar *)" ?args...?", -1);
+  }
+  p->zUsage = zUsage;
+  p->nUsage = nUsage;
+
+  /* Register the new command with the th1 interpreter. */
+  zName = (char *)argv[1];
+  rc = Th_CreateCommand(interp, zName, proc_call1, (void *)p, proc_del);
+  if( rc==TH_OK ){
+    Th_SetResult(interp, 0, 0);
+  }
+
+  Th_Free(interp, azParam);
+  return TH_OK;
+
+ error_out:
+  Th_Free(interp, azParam);
+  Th_Free(interp, zUsage);
+  return TH_ERROR;
+}
+
+/*
+** TH Syntax:
+**
+**   rename oldcmd newcmd
+*/
+static int rename_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  if( argc!=3 ){
+    return Th_WrongNumArgs(interp, "rename oldcmd newcmd");
+  }
+  return Th_RenameCommand(interp, argv[1], argl[1], argv[2], argl[2]);
+}
+
+/*
+** TH Syntax:
+**
+**   break    ?value...?
+**   continue ?value...?
+**   ok       ?value...?
+**   error    ?value...?
+*/
+static int simple_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  if( argc!=1 && argc!=2 ){
+    return Th_WrongNumArgs(interp, "return ?value?");
+  }
+  if( argc==2 ){
+    Th_SetResult(interp, argv[1], argl[1]);
+  }
+  return (int)ctx;
+}
+
+/*
+** TH Syntax:
+**
+**   return ?-code code? ?value?
+*/
+static int return_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int iCode = TH_RETURN;
+  if( argc<1 || argc>4 ){
+    return Th_WrongNumArgs(interp, "return ?-code code? ?value?");
+  }
+  if( argc>2 ){
+    int rc = Th_ToInt(interp, argv[2], argl[2], &iCode);
+    if( rc!=TH_OK ){
+      return rc;
+    }
+  }
+  if( argc==2 || argc==4 ){
+    Th_SetResult(interp, argv[argc-1], argl[argc-1]);
+  }
+  return iCode;
+}
+
+/*
+** TH Syntax:
+**
+**   string compare STRING1 STRING2
+*/
+static int string_compare_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  const uchar *zRight; int nRight;
+  const uchar *zLeft; int nLeft;
+
+  int i;
+  int iRes = 0;
+
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "string compare str1 str2");
+  }
+
+  zLeft = argv[2];
+  nLeft = argl[2];
+  zRight = argv[3];
+  nRight = argl[3];
+
+  for(i=0; iRes==0 && i<nLeft && i<nRight; i++){
+    iRes = zLeft[i]-zRight[i];
+  }
+  if( iRes==0 ){
+    iRes = nLeft-nRight;
+  }
+
+  if( iRes<0 ) iRes = -1;
+  if( iRes>0 ) iRes = 1;
+
+  return Th_SetResultInt(interp, iRes);
+}
+
+/*
+** TH Syntax:
+**
+**   string first NEEDLE HAYSTACK
+*/
+static int string_first_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  const uchar *zNeedle;
+  int nNeedle;
+  const uchar *zHaystack;
+  int nHaystack;
+  int i;
+  int iRes;
+
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "string first needle haystack");
+  }
+
+  zNeedle = argv[2];
+  nNeedle = argl[2];
+  zHaystack = argv[3];
+  nHaystack = argl[3];
+
+  for(i=0; i<(nHaystack-nNeedle); i++){
+    if( 0==memcmp(zNeedle, &zHaystack[i], nNeedle) ){
+      iRes = i;
+      break;
+    }
+  }
+
+  return Th_SetResultInt(interp, iRes);
+}
+
+/*
+** TH Syntax:
+**
+**   string is CLASS STRING
+*/
+static int string_is_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  int i;
+  int iRes = 1;
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "string is class string");
+  }
+  if( argl[2]!=5 || 0!=memcmp(argv[2], "alnum", 5) ){
+    Th_ErrorMessage(interp, "Expected alnum, got: ", argv[2], argl[2]);
+    return TH_ERROR;
+  }
+
+  for(i=0; i<argl[3]; i++){
+    if( !th_isalnum(argv[3][i]) ){
+      iRes = 0;
+    }
+  }
+
+  return Th_SetResultInt(interp, iRes);
+}
+
+/*
+** TH Syntax:
+**
+**   string last NEEDLE HAYSTACK
+*/
+static int string_last_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  const uchar *zNeedle;
+  int nNeedle;
+  const uchar *zHaystack;
+  int nHaystack;
+  int i;
+  int iRes;
+
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "string first needle haystack");
+  }
+
+  zNeedle = argv[2];
+  nNeedle = argl[2];
+  zHaystack = argv[3];
+  nHaystack = argl[3];
+
+  for(i=nHaystack-nNeedle-1; i>=0; i--){
+    if( 0==memcmp(zNeedle, &zHaystack[i], nNeedle) ){
+      iRes = i;
+      break;
+    }
+  }
+
+  return Th_SetResultInt(interp, iRes);
+}
+
+/*
+** TH Syntax:
+**
+**   string length STRING
+*/
+static int string_length_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  if( argc!=3 ){
+    return Th_WrongNumArgs(interp, "string length string");
+  }
+  return Th_SetResultInt(interp, argl[2]);
+}
+
+/*
+** TH Syntax:
+**
+**   string range STRING FIRST LAST
+*/
+static int string_range_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  int iStart;
+  int iEnd;
+
+  if( argc!=5 ){
+    return Th_WrongNumArgs(interp, "string range string first last");
+  }
+
+  if( argl[4]==3 && 0==memcmp("end", argv[4], 3) ){
+    iEnd = argl[2];
+  }else if( Th_ToInt(interp, argv[4], argl[4], &iEnd) ){
+    Th_ErrorMessage(
+        interp, "Expected \"end\" or integer, got:", argv[4], argl[4]);
+    return TH_ERROR;
+  }
+  if( Th_ToInt(interp, argv[3], argl[3], &iStart) ){
+    return TH_ERROR;
+  }
+
+  if( iStart<0 ) iStart = 0;
+  if( iEnd>=argl[2] ) iEnd = argl[2]-1;
+  if( iStart>iEnd ) iEnd = iStart-1;
+
+  return Th_SetResult(interp, &argv[2][iStart], iEnd-iStart+1);
+}
+
+/*
+** TH Syntax:
+**
+**   string repeat STRING COUNT
+*/
+static int string_repeat_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  int n;
+  int i;
+  int nByte;
+  uchar *zByte;
+
+  if( argc!=4 ){
+    return Th_WrongNumArgs(interp, "string repeat string n");
+  }
+  if( Th_ToInt(interp, argv[3], argl[3], &n) ){
+    return TH_ERROR;
+  }
+
+  nByte = argl[2] * n;
+  zByte = Th_Malloc(interp, nByte+1);
+  for(i=0; i<nByte; i+=argl[2]){
+    memcpy(&zByte[i], argv[2], argl[2]);
+  }
+
+  Th_SetResult(interp, zByte, nByte);
+  Th_Free(interp, zByte);
+  return TH_OK;
+}
+
+/*
+** TH Syntax:
+**
+**   info exists VAR
+*/
+static int info_exists_command(
+  Th_Interp *interp, void *ctx, int argc, const uchar **argv, int *argl
+){
+  int rc;
+
+  if( argc!=3 ){
+    return Th_WrongNumArgs(interp, "info exists var");
+  }
+  rc = Th_GetVar(interp, argv[2], argl[2]);
+  Th_SetResultInt(interp, rc?0:1);
+  return TH_OK;
+}
+
+/*
+** TH Syntax:
+**
+**   unset VAR
+*/
+static int unset_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  if( argc!=2 ){
+    return Th_WrongNumArgs(interp, "unset var");
+  }
+  return Th_UnsetVar(interp, argv[1], argl[1]);
+}
+
+int Th_CallSubCommand(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl,
+  Th_SubCommand *aSub
+){
+  int i;
+  for(i=0; aSub[i].zName; i++){
+    uchar *zName = (uchar *)aSub[i].zName;
+    if( th_strlen(zName)==argl[1] && 0==memcmp(zName, argv[1], argl[1]) ){
+      return aSub[i].xProc(interp, ctx, argc, argv, argl);
+    }
+  }
+
+  Th_ErrorMessage(interp, "Expected sub-command, got:", argv[1], argl[1]);
+  return TH_ERROR;
+}
+
+/*
+** TH Syntax:
+**
+**   string compare STR1 STR2
+**   string first   NEEDLE HAYSTACK ?STARTINDEX?
+**   string is      CLASS STRING
+**   string last    NEEDLE HAYSTACK ?STARTINDEX?
+**   string length  STRING
+**   string range   STRING FIRST LAST
+**   string repeat  STRING COUNT
+*/
+static int string_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  Th_SubCommand aSub[] = {
+    { "compare", string_compare_command },
+    { "first",   string_first_command },
+    { "is",      string_is_command },
+    { "last",    string_last_command },
+    { "length",  string_length_command },
+    { "range",   string_range_command },
+    { "repeat",  string_repeat_command },
+    { 0, 0 }
+  };
+  return Th_CallSubCommand(interp, ctx, argc, argv, argl, aSub);
+}
+
+/*
+** TH Syntax:
+**
+**   info exists VARNAME
+*/
+static int info_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  Th_SubCommand aSub[] = {
+    { "exists",  info_exists_command },
+    { 0, 0 }
+  };
+  return Th_CallSubCommand(interp, ctx, argc, argv, argl, aSub);
+}
+
+/*
+** Convert the script level frame specification (used by the commands
+** [uplevel] and [upvar]) in (zFrame, nFrame) to an integer frame as
+** used by Th_LinkVar() and Th_Eval(). If successful, write the integer
+** frame level to *piFrame and return TH_OK. Otherwise, return TH_ERROR
+** and leave an error message in the interpreter result.
+*/
+static int thToFrame(
+  Th_Interp *interp,
+  const uchar *zFrame,
+  int nFrame,
+  int *piFrame
+){
+  int iFrame;
+  if( th_isdigit(zFrame[0]) ){
+    int rc = Th_ToInt(interp, zFrame, nFrame, &iFrame);
+    if( rc!=TH_OK ) return rc;
+    iFrame = iFrame * -1;
+  }else if( zFrame[0]=='#' ){
+    int rc = Th_ToInt(interp, &zFrame[1], nFrame-1, &iFrame);
+    if( rc!=TH_OK ) return rc;
+    iFrame = iFrame + 1;
+  }else{
+    return TH_ERROR;
+  }
+  *piFrame = iFrame;
+  return TH_OK;
+}
+
+/*
+** TH Syntax:
+**
+**   uplevel ?LEVEL? SCRIPT
+*/
+static int uplevel_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int iFrame = -1;
+
+  if( argc!=2 && argc!=3 ){
+    return Th_WrongNumArgs(interp, "uplevel ?level? script...");
+  }
+  if( argc==3 && TH_OK!=thToFrame(interp, argv[1], argl[1], &iFrame) ){
+    return TH_ERROR;
+  }
+  return Th_Eval(interp, iFrame, argv[argc-1], -1);
+}
+
+/*
+** TH Syntax:
+**
+**   upvar ?FRAME? OTHERVAR MYVAR ?OTHERVAR MYVAR ...?
+*/
+static int upvar_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int iVar = 1;
+  int iFrame = -1;
+  int rc = TH_OK;
+  int i;
+
+  if( TH_OK==thToFrame(0, argv[1], argl[1], &iFrame) ){
+    iVar++;
+  }
+  if( argc==iVar || (argc-iVar)%2 ){
+    return Th_WrongNumArgs(interp,
+        "upvar frame othervar myvar ?othervar myvar...?");
+  }
+  for(i=iVar; rc==TH_OK && i<argc; i=i+2){
+    rc = Th_LinkVar(interp, argv[i+1], argl[i+1], iFrame, argv[i], argl[i]);
+  }
+  return rc;
+}
+
+/*
+** TH Syntax:
+**
+**   breakpoint ARGS
+**
+** This command does nothing at all. Its purpose in life is to serve
+** as a point for setting breakpoints in a debugger.
+*/
+static int breakpoint_command(
+  Th_Interp *interp,
+  void *ctx,
+  int argc,
+  const uchar **argv,
+  int *argl
+){
+  int cnt = 0;
+  cnt++;
+  return TH_OK;
+}
+
+/*
+** Register the built-in th1 language commands with interpreter interp.
+** Usually this is called soon after interpreter creation.
+*/
+int th_register_language(Th_Interp *interp){
+  /* Array of built-in commands. */
+  struct _Command {
+    const char *zName;
+    Th_CommandProc xProc;
+    void *pContext;
+  } aCommand[] = {
+    {"catch",    catch_command,   0},
+    {"expr",     expr_command,    0},
+    {"for",      for_command,     0},
+    {"if",       if_command,      0},
+    {"info",     info_command,    0},
+    {"lindex",   lindex_command,  0},
+    {"list",     list_command,    0},
+    {"llength",  llength_command, 0},
+    {"proc",     proc_command,    0},
+    {"rename",   rename_command,  0},
+    {"set",      set_command,     0},
+    {"string",   string_command,  0},
+    {"unset",    unset_command,   0},
+    {"uplevel",  uplevel_command, 0},
+    {"upvar",    upvar_command,   0},
+
+    {"breakpoint", breakpoint_command, 0},
+
+    {"return",   return_command, 0},
+    {"break",    simple_command, (void *)TH_BREAK},
+    {"continue", simple_command, (void *)TH_CONTINUE},
+    {"error",    simple_command, (void *)TH_ERROR},
+
+    {0, 0}
+  };
+  int i;
+
+  /* Add the language commands. */
+  for(i=0; i<(sizeof(aCommand)/sizeof(aCommand[0])); i++){
+    void *ctx = aCommand[i].pContext;
+    Th_CreateCommand(interp, aCommand[i].zName, aCommand[i].xProc, ctx, 0);
+  }
+
+  return TH_OK;
+}