/*
** Read an SQLite database file and analyze its space utilization.  Generate
** text on standard output.
*/
#define TCLSH_INIT_PROC sqlite3_analyzer_init_proc
IFDEF INCLUDE_SQLITE3_C
#undef SQLITE_ENABLE_DBSTAT_VTAB
#define SQLITE_ENABLE_DBSTAT_VTAB 1
#undef SQLITE_THREADSAFE
#define SQLITE_THREADSAFE 0
#undef SQLITE_ENABLE_COLUMN_METADATA
#define SQLITE_OMIT_DECLTYPE 1
#define SQLITE_OMIT_DEPRECATED 1
#define SQLITE_OMIT_PROGRESS_CALLBACK 1
#define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
#define SQLITE_OMIT_LOAD_EXTENSION 1
INCLUDE sqlite3.c
ELSE
#include "sqlite3.h"
ENDIF
INCLUDE $ROOT/src/tclsqlite.c

#if defined(_WIN32)
INCLUDE $ROOT/ext/misc/sqlite3_stdio.h
INCLUDE $ROOT/ext/misc/sqlite3_stdio.c

/* Substitute "puts" command.  Only these forms recognized:
**
**      puts STRING
**      puts stderr STRING
**      puts -nonewline STRING
*/
static int subst_puts(
  void *NotUsed,
  Tcl_Interp *interp,
  int objc,
  Tcl_Obj *const*objv
){
  FILE *pOut = stdout;
  const char *zOut;
  int addNewLine = 1;
  if( objc==2 ){
    zOut = Tcl_GetString(objv[1]);
  }else if( objc!=3 ){
    Tcl_WrongNumArgs(interp, 1, objv, "?stderr|-nonewline? STRING");
    return TCL_ERROR;
  }else{
    const char *zArg = Tcl_GetString(objv[1]);
    if( zArg==0 ) return TCL_ERROR;
    zOut = Tcl_GetString(objv[2]);
    if( strcmp(zArg, "stderr")==0 ){
      pOut = stderr;
    }else if( strcmp(zArg, "-nonewline")==0 ){
      addNewLine = 0;
    }else{
      Tcl_AppendResult(interp, "bad argument: ", zArg, NULL);
      return TCL_ERROR;
    }
  }
  sqlite3_fputs(zOut, pOut);
  if( addNewLine ) sqlite3_fputs("\n", pOut);
  fflush(pOut);
  return TCL_OK;
}
#endif /* defined(_WIN32) */

const char *sqlite3_analyzer_init_proc(Tcl_Interp *interp){
#if defined(_WIN32)
  Tcl_CreateObjCommand(interp, "puts", subst_puts, 0, 0);
#else  
  (void)interp;
#endif
  return
BEGIN_STRING
INCLUDE $ROOT/tool/spaceanal.tcl
END_STRING
;
}
