⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apinit.c

📁 数据挖掘经典的hierarchial clustering algorithm
💻 C
字号:
/*
  ========================================================================
  DEVise Data Visualization Software
  (c) Copyright 1992-1996
  By the DEVise Development Group
  Madison, Wisconsin
  All Rights Reserved.
  ========================================================================

  Under no circumstances is this software to be copied, distributed,
  or altered in any way without prior permission from the DEVise
  Development Group.
*/

/*
  $Id: ApInit.c,v 1.4 1996/10/07 22:53:41 wenger Exp $

  $Log: ApInit.c,v $
  Revision 1.4  1996/10/07 22:53:41  wenger
  Added more error checking and better error messages in response to
  some of the problems uncovered by CS 737 students.

  Revision 1.3  1996/08/02 15:53:31  wenger
  Added AttrProj member functions for reading entire records (no projection).

  Revision 1.2  1996/05/22 18:50:39  wenger
  Greatly simplified Init::DoInit() to only do what's necessary for
  attribute projection; other minor changes.

  Revision 1.1  1996/04/22 18:01:43  wenger
  First version of "attribute projection" code.  The parser (with
  the exception of instantiating any TData) compiles and runs.

*/

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>

//#include "Dispatcher.h"
#include "Exit.h"
#include "ApInit.h"
#include "Time.h"
#include "Timer.h"
#include "BufPolicy.h"
#include "Util.h"


/*************************************************************
Create unique temporary file name
**************************************************************/

static char uniqueFileName[100];
static char *CreateUniqueFileName(char *progname)
{
  progname = StripPath(progname);
  pid_t pid = getpid();
  for(char char1 = 'a'; char1 <= 'z'; char1++) {
    for(char char2 = 'a'; char2 <= 'z'; char2++) {
      sprintf(uniqueFileName, "work/%s_%05ld%c%c", progname,
              (long)pid, char1, char2);
      int fd = open(uniqueFileName, O_WRONLY, 0666);
      if (fd < 0)
        return uniqueFileName;
      close(fd);
    }
  }

  DOASSERT(0, "Cannot create unique temporary file name");

  return NULL; /* keep compiler happy */
}

Boolean Init::_savePopup = false; /* TRUE if save pop up window
                                                and wait for button event */
Boolean Init::_doPlayback = false; /* TRUE if do journal playback */
char *Init::_playbackFile = ""; /* name of playback file */
Boolean Init::_prefetch = true; /* TRUE if buffer manager does prefetch */
int Init::_bufferSize= 1536;            /* size of buffer */
BufPolicy::policy Init::_policy= BufPolicy::FIFO; /* policy for buffer manager*/
/* TRUE if existing buffers should be checked first in query processing */
Boolean Init::_existing = true;
Boolean Init::_tdataQuery = false; /* TRUE if file is tdata, else gdata */
Boolean Init::_convertGData = true; /* true if TData is converted into G
                                                                        while system is idle */
Boolean Init::_abort = false; /* TRUE if abort instead of exit() on program
                                                        exit */
Boolean Init::_iconify= false; /* TRUE if windows are iconified when
                                                        restoring a session */
int Init::_gdataPages = -1; /* max # of disk pages for gdata */
char *Init::_progName = 0; /* name of program */
char *Init::_workDir = 0; /* name of work directory */
char *Init::_tmpDir = 0;/* name of temp directory */
char *Init::_cacheDir = 0;/* name of cache directory */
char *Init::_sessionName = "session.tk";        /* name of program */
Boolean Init::_dispLogo = true;
char *Init::_batchFile = 0;
char *Init::_qpName = "default"; /* name of query processor */
Boolean Init::_restore = false; /* TRUE if we need to restore a session file */
long Init::_progModTime;        /* when program was modified */
Boolean Init::_randomize = true; /* true if TData fetches are randomized */
int Init::_pageSize = 16384;    /* size of page */
Boolean Init::_hasXLow=false, Init::_hasYLow = false;
Boolean Init::_hasXHigh=false, Init::_hasYHigh = false;
Coord Init::_xLow, Init::_yLow, Init::_xHigh, Init::_yHigh;
Boolean Init::_simpleInterpreter = true; /* true if interpreted
        mapping should use its own interpreter to process
        simple commands instead of calling tcl */
Boolean Init::_printTDataAttr = false; /* true to print
        TData attribute list when it's created */
Boolean Init::_elimOverlap = true; /* true if overlapping
        GData should be eliminated while drawing */
Boolean Init::_dispGraphics = true; /* true to display graphics */
Boolean Init::_batchRecs = true; /* true if batching records */
Boolean Init::_printViewStat = false;  /* true to print view statistics */

/**************************************************************
Remove positions from index to index+len-1 from argv
Update argc.
***************************************************************/

static void MoveArg(int &argc, char **argv, int index, int len)
{
  DOASSERT(index + len <= argc, "Argument too long");

  for(int j = index + len; j < argc; j++)
    argv[j - len] = argv[j];

  argc -= len;
}

static void Usage(char *prog)
{
  fprintf(stderr, "Usage: %s [options]\n", prog);
  fprintf(stderr, "\nOptions are:\n");
  fprintf(stderr, "\t-journal file: name of journal file\n");
  fprintf(stderr, "\t-play file: journal file to play back\n");
  fprintf(stderr, "\t-buffer size: buffer size in pages\n");
  fprintf(stderr, "\t-prefetch yes_no: do prefetch or not\n");
  fprintf(stderr, "\t-policy policy: buffer replacement policy, one of:\n");
  fprintf(stderr, "\t                lru, fifo, lifo, focal, or rnd\n");
  fprintf(stderr, "\t-existing yes_no: use existing buffers first or not\n");
  fprintf(stderr, "\t-norandom: don't randomize record retrieval\n");
  fprintf(stderr, "\t-batch file: batch file to execute\n");
  Exit::DoExit(1);
}

static void CatchInt(int)
{
#if 0
  Dispatcher::QuitNotify();
#endif
}

void Init::DoInit()
{
#if 0
  /* set up interrupt handling for INTR */
  (void)signal(SIGINT, CatchInt);
#endif

#if 1
  /* Create work directory, if needed */
  char *workDir = "/tmp";
  _workDir = CopyString(workDir);
#endif

  /* Get name of cache directory. */
  char *cacheDir = getenv("DEVISE_CACHE");
  if (!cacheDir) cacheDir = ".";
  _cacheDir = CopyString(cacheDir);

#if 0
  char *journalName = NULL;
#define MAXARGS 512
  char *args[512];

  DOASSERT(argc <= MAXARGS, "Too many arguments");
#endif

#if 0
  for(int j = 0; j < argc; j++)
    args[j] = argv[j];

  /* init current time */
  DeviseTime::Init();

#if 0
  Timer::InitTimer();
#endif

  _progName = CopyString(argv[0]);
  _progModTime = ModTime(argv[0]);

  char *tmpDir =  getenv("DEVISE_TMP");
  if (!tmpDir)
    tmpDir = "tmp";

  CheckAndMakeDirectory(tmpDir);
  pid_t pid = getpid();
  char buf[512];
  DOASSERT(strlen(tmpDir) + 20 <= 512, "String space too small");
  sprintf(buf, "%s/DEVise_%ld", tmpDir, (long)pid);
  CheckAndMakeDirectory(buf, true);
  _tmpDir = CopyString(buf);

  /* parse parameters */
  int i = 1;
  while (i < argc) {
    if (argv[i][0] == '-') {

      if (strcmp(&argv[i][1], "queryProc") == 0) {
        if (i >= argc-1)
          Usage(argv[0]);
        _qpName = CopyString(argv[i+1]);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "batch") == 0) {
        if (i >= argc - 1)
          Usage(argv[0]);
        _batchFile = CopyString(argv[i + 1]);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "session") == 0) {
        if (i >= argc-1)
          Usage(argv[0]);
        _sessionName = CopyString(argv[i + 1]);
        _restore = true;
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "playback") == 0) {
        if (i >= argc-1)
          Usage(argv[0]);
        _playbackFile = CopyString(argv[i+1]);
        _doPlayback = true;
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "journal") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        journalName = CopyString(argv[i+1]);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "buffer") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _bufferSize = atoi(argv[i+1]);
        if (_bufferSize <= 0) {
          fprintf(stderr, "invalid buffer size %d\n", _bufferSize);
          Usage(argv[0]);
        }
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "pagesize") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _pageSize = atoi(argv[i+1]);
        if (_pageSize <= 0) {
          fprintf(stderr, "invalid buffer size %d\n", _pageSize);
          Usage(argv[0]);
        }
        if ((_pageSize % 4096) != 0) {
          fprintf(stderr, "page %d must be multiple of 4096\n", _pageSize);
          Usage(argv[0]);
        }
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "policy") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        if (strcmp(argv[i+1], "lru") == 0)
          _policy = BufPolicy::LRU;
        else if (strcmp(argv[i+1], "fifo") == 0)
          _policy = BufPolicy::FIFO;
        else if (strcmp(argv[i+1], "lifo") == 0)
          _policy = BufPolicy::LIFO;
        else if (strcmp(argv[i+1], "rnd") == 0)
          _policy = BufPolicy::RND;
        else if (strcmp(argv[i+1], "focal") == 0)
          _policy = BufPolicy::FOCAL;
        else {
          fprintf(stderr, "unknown policy %s\n", argv[i+1]);
          Usage(argv[0]);
        }
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "prefetch") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _prefetch = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "printViewStat") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _printViewStat = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "batchRecs") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _batchRecs = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "dispGraphics") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _dispGraphics = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "elimOverlap") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _elimOverlap = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "existing") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _existing = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "gdata") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _tdataQuery = (atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "gdatapages") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _gdataPages = atoi(argv[i+1]);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "convert") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _convertGData = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "iconify") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _iconify = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "printTDataAttr") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _printTDataAttr = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "simpleInterpreter") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _simpleInterpreter = !(atoi(argv[i+1]) == 0);
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "nologo") == 0) {
        _dispLogo = false;
        MoveArg(argc,argv,i,1);
      }

      else if (strcmp(&argv[i][1], "abort") == 0) {
        _abort = true;
        MoveArg(argc,argv,i,1);
      }

      else if (strcmp(&argv[i][1], "savePopup") == 0) {
        _savePopup = true;
        MoveArg(argc,argv,i,1);
      }

      else if (strcmp(&argv[i][1], "norandom") == 0) {
        _randomize = false;
        MoveArg(argc,argv,i,1);
      }

      else if (strcmp(&argv[i][1], "xlow") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _xLow = atof(argv[i+1]);
        _hasXLow = true;
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "ylow") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _yLow = atof(argv[i+1]);
        _hasYLow = true;
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "xhigh") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _xHigh = atof(argv[i+1]);
        _hasXHigh = true;
        MoveArg(argc,argv,i,2);
      }

      else if (strcmp(&argv[i][1], "yhigh") == 0) {
        if (i >= argc -1)
          Usage(argv[0]);
        _yHigh = atof(argv[i+1]);
        _hasYHigh = true;
        MoveArg(argc,argv,i,2);
      }
      else i++;
    }
    else i++;
  }
#endif

#if 0
  if (!journalName)
    journalName = CreateUniqueFileName(argv[0]);
#endif

#if 0
  Journal::Init(journalName, argc, args);
#endif
}

void Init::BufPolicies(int &bufSize, Boolean &prefetch,
                       BufPolicy::policy &policy, Boolean &existing)
{
  bufSize = _bufferSize;
  prefetch = _prefetch;
  policy = _policy;
  existing = _existing;
}

long Init::ProgModTime()
{
  return _progModTime;
}

int Init::PageSize()
{
  return _pageSize;
}

BufPolicy::policy Init::Policy()
{
  return _policy;
}

Boolean Init::GetXLow(Coord &xLow)
{
  xLow = _xLow;
  return _hasXLow;
}

Boolean Init::GetYLow(Coord &yLow)
{
  yLow = _yLow;
  return _hasYLow;
}

Boolean Init::GetXHigh(Coord &xHigh)
{
  xHigh = _xHigh;
  return _hasXHigh;
}

Boolean Init::GetYHigh(Coord &yHigh)
{
  yHigh = _yHigh;
  return _hasYHigh;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -