Exemplo n.º 1
0
void Database::prepareTableForActions() {
	char* _errMsg = NULL;
	int _res = 0;
	_res = sqlite3_exec( m_db, "CREATE TABLE IF NOT EXISTS Actions ( id INTEGER PRIMARY KEY,   \
																	 scriptName TEXT NOT NULL, \
																	 date TEXT,                \
																	 time TEXT,                \
																	 xdays INTEGER,            \
																	 days TINYINT );", NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}

	_res = sqlite3_exec( m_db, "CREATE TABLE IF NOT EXISTS ExcludedDates ( id INTEGER PRIMARY KEY,   \
																	 refId INTEGER NOT NULL, \
																	 time TIME );", NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}

	clearActions();
}
Exemplo n.º 2
0
void Database::insertAction( QDate date, Action* action ) {
	char* _errMsg = NULL;

	// make the month/day numbers as 2-digits
	QString _strMonth = QString::number( date.month() );
	QString _strMonthMM = _strMonth.length() == 1 ? "0" + _strMonth : _strMonth;
	QString _strDay = QString::number( date.day() );
	QString _strDayDD = _strDay.length() == 1 ? "0" + _strDay : _strDay;
	QString _XDays = action->isXDays() ? QString::number( action->getXDays() ) : QString::number( 0 );

	// prepare the query
	QString _query = QString( "INSERT INTO Actions VALUES( " ) +
					"NULL, " +
					"'" + action->getScript()->getFileName() + "', " +
					"'" + QString::number( date.year() ) + "-" + _strMonthMM + "-" + _strDayDD + "', " +
					"'" + action->getHoursHH() + ":" + action->getMinutesMM() + ":" + action->getSecondsSS() + "', " +
					_XDays + ", " +
					QString::number( action->getDays()  ) + " );";

	//qDebug( "query: %d", sqlite3_last_insert_rowid( m_db ) );
	int _res = sqlite3_exec( m_db, _query.toStdString().c_str(), NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}

	int _lastId = sqlite3_last_insert_rowid( m_db );

	// create string which will be put into database in form of "date|date|date|..."
	QString _excludedDates = "";
	int _excludedDatesNumber = action->getExcludedDates().size();
	for( int i = 0; i < _excludedDatesNumber; ++i ) {
		QDate _date = action->getExcludedDates().at( i );
		QString _Year    = QString::number( _date.year() );
		QString _MonthMM = _date.month() < 10 ? "0" + QString::number( _date.month() ) : QString::number( _date.month() );
		QString _DayDD   = _date.day() < 10 ? "0" + QString::number( _date.day() ) : QString::number( _date.day() );
		_excludedDates += _Year + "-" + _MonthMM + "-" + _DayDD;

		// prepare the query
		QString _queryED = QString( "INSERT INTO ExcludedDates VALUES( " ) +
						"NULL, " +
						QString::number( _lastId ) + ", " +
						"'" + _excludedDates + "' );";

		//qDebug( "query: %s", _queryED.toStdString().c_str() );
		int _res = sqlite3_exec( m_db, _queryED.toStdString().c_str(), NULL, NULL, &_errMsg );
		if( _res != SQLITE_OK ) {
			QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
					QMessageBox::Ok );
			_msg.exec();
			sqlite3_free( _errMsg );
		}
	}
}
Exemplo n.º 3
0
void g()
{
#ifdef TEST_MULTI_UNIT
  assert(1 < 2);
  assert(1 > 2 && _msg("1 is bigger than 2 isn't it? (unitB)"));
#endif
}
Exemplo n.º 4
0
	void Log::add(ssh_wcs msg)
	{
		if(_log)
		{
			String _msg(apply_template(L"", L"", 0, 0, msg, _log->trace_template));
			switch(_log->_out)
			{
				case TypeOutput::Net:
					if(sock.is_closed())
					{
						sock.init(_log->host_name, 0, _log->host_flags, _log->host_cert, _log->host_pwd_cert);
						sendSocket(_log->string_begin);
					}
					sendSocket(_msg);
					break;
				case TypeOutput::File:
					if(!file.is_close()) file.write(_msg, L"utf-8");
					break;
				case TypeOutput::Mail:
					if(!_log->email_blocked)
					{
						if(!file.is_close()) file.write(_msg, cp_utf);
						_log->email_count_msgs++;
						if(_log->email_count_msgs >= _log->email_max_msgs)
							send_email(_log->string_continue);
					}
					break;
				case TypeOutput::Debug:
					OutputDebugStringW(_msg);
					break;
			}
		}
	}
Exemplo n.º 5
0
std::string SocketSystem::GetLastMsg(bool WantSocketMsg) {

// ask system what type of error occurred

  DWORD errorCode;
  if(WantSocketMsg)
    errorCode = WSAGetLastError();
  else
    errorCode = GetLastError();
  if(errorCode == 0)
    return "no error";

// map errorCode into a system defined error string
    
  DWORD dwFlags = 
    FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER;
  LPCVOID lpSource = NULL;
  DWORD dwMessageID = errorCode;
  DWORD dwLanguageId = MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US);
  LPSTR lpBuffer;
  DWORD nSize = 0;
  va_list *Arguments = NULL;

  FormatMessage(
    dwFlags,lpSource,dwMessageID,dwLanguageId, 
    (LPTSTR)&lpBuffer,nSize,Arguments
  );

  std::string _msg(lpBuffer);
  LocalFree(lpBuffer);
  return _msg;
}
Exemplo n.º 6
0
/*
static void _error (const char *format, ...) {
	va_list v;
	va_start(v, format);
	_msg("ERROR", format, v);
	va_end(v);
}
*/
static void _fatal (const char *format, ...) {
	va_list v;
	va_start(v, format);
	_msg("FATAL", format, v);
	va_end(v);
	sleep(3);
	exit(1);
}
Exemplo n.º 7
0
RedisError::RedisError(const char *format, ...)
{
  va_list ap;
  va_start(ap, format);
  std::string _msg(RedisError_createMessage(format, ap));
  va_end(ap);
  std::string* pmsg = const_cast<std::string*>(&msg);
  pmsg->append(msg);
}
Exemplo n.º 8
0
void Database::open() {
	int _fail = sqlite3_open( m_dbName.toStdString().c_str(), &m_db );

	// if the function above failed, then _fail > 0
	if( _fail ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "Couldn't open database: " + QString( sqlite3_errmsg( m_db ) ),
				QMessageBox::Ok );
		_msg.exec();
		return;
	}
}
Exemplo n.º 9
0
/*virtual*/
void
KexiGUIMessageHandler::showErrorMessageInternal(KexiDB::Object *obj, const QString& msg)
{
    QString _msg(msg);
    if (!obj) {
        showErrorMessageInternal(_msg);
        return;
    }
    QString details;
    KexiDB::getHTMLErrorMesage(obj, _msg, details);
    showErrorMessageInternal(_msg, details);
}
Exemplo n.º 10
0
void Database::clearSettings() {
	char* _errMsg = NULL;

	// truncate table (in sqlite there's no TRUNCATE keyword)
	int _res = sqlite3_exec( m_db, "DELETE FROM Settings;", NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}
}
Exemplo n.º 11
0
void KexiGUIMessageHandler::showErrorMessage(const QString &msg, const QString &details,
        KexiDB::Object *obj)
{
    QString _msg(msg);
    if (!obj) {
        showErrorMessage(_msg, details);
        return;
    }
    QString _details(details);
    KexiDB::getHTMLErrorMesage(obj, _msg, _details);
    showErrorMessage(_msg, _details);
}
Exemplo n.º 12
0
int program_make(struct program *prog, struct shader **shader, int num)
{
	int i;
	GLchar log[256] = "nil";
	GLsizei len = 0;
	GLint res = GL_FALSE;

	if (!prog) {
		errno = EFAULT;
		return -1;
	}

	timeinit();

	prog->id = glCreateProgram();
	if (prog->id == 0) {
		glerr("glCreateProgram() failed");
		return -1;
	}

	prog->shader = shader;
	prog->shader_num = num;

	for (i = 0; i < num; i++) {
		if (make_shader(shader[i]) < 0) {
			_err("shader %s failed\n", shader[i]->name);
			goto err;
		}
		glAttachShader(prog->id, shader[i]->id);
	}

	timestart();
	glLinkProgram(prog->id);
	glGetProgramiv(prog->id, GL_LINK_STATUS, &res);
	if (res != GL_TRUE) {
		_err("failed to link program\n");
		goto err;
	}

	timestop("program %d linked\n", prog->id);
	return prog->id;

err:
	if (prog->id > 0) {
		glGetProgramInfoLog(prog->id, sizeof (log), &len, log);
		_msg("len: %d, log: %s\n", len, log);
	}

	program_clean(prog);
	return -1;
}
Exemplo n.º 13
0
void Database::prepareTableForSettings() {
	char* _errMsg = NULL;
	int _res = 0;
	_res = sqlite3_exec( m_db, "CREATE TABLE IF NOT EXISTS Settings ( id INTEGER PRIMARY KEY,   \
																	  key TEXT NOT NULL, \
																	  value TEXT NOT NULL );", NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}

	clearSettings();
}
Exemplo n.º 14
0
void Database::insertSetting( QString key, QString value ) {
	char* _errMsg = NULL;

	// prepare the query
	QString _query = QString( "INSERT INTO Settings VALUES( " ) +
					"NULL, " +
					"'" + key + "', " +
					"'" + value + "' );";

	//qDebug( "query: %s", _query.toStdString().c_str() );
	int _res = sqlite3_exec( m_db, _query.toStdString().c_str(), NULL, NULL, &_errMsg );
	if( _res != SQLITE_OK ) {
		QMessageBox _msg( QMessageBox::Critical, "Error", "SQL error: " + QString( _errMsg ),
				QMessageBox::Ok );
		_msg.exec();
		sqlite3_free( _errMsg );
	}
}
Exemplo n.º 15
0
static int make_shader(struct shader *shader)
{
	GLint res = GL_FALSE;
	GLsizei len = 0;
	GLchar log[4096] = "nil";/* FIXME: some drivers return wrong values for
				 * GL_INFO_LOG_LENGTH use a fixed size instead
				 */
	timeinit();

	if (!shader) {
		errno = EFAULT;
		return -1;
	}

	timestart();

	shader->id = glCreateShader(shader->type);
	if (shader->id == 0) {
		glerr("glCreateShader(%s) failed", shader->name);
		goto error;
	}

	glShaderSource(shader->id, 1, &shader->code, NULL);
	glCompileShader(shader->id);
	glGetShaderiv(shader->id, GL_COMPILE_STATUS, &res);
	if (res != GL_TRUE) {
		glerr("glCompileShader(%s) failed", shader->name);
		goto error;
	}

	timestop("compiled shader %s, id %d type 0x%04x\n", shader->name,
		 shader->id, shader->type);
	return 0;

error:
	if (shader->id > 0) {
		glGetShaderInfoLog(shader->id, sizeof(log), &len, log);
		_msg("len: %d, log: %s\n", len, log);
		glDeleteShader(shader->id);
		shader->id = 0;
	}
	return -1;
}
Exemplo n.º 16
0
/* Linux and AIX syslog format:
Oct  4 17:10:37 hostname socat[52798]: D signal(13, 1)
*/
void msg(int level, const char *format, ...) {
#if HAVE_GETTIMEOFDAY || 1
   struct timeval now;
   int result;
   time_t nowt;
#else /* !HAVE_GETTIMEOFDAY */
   time_t now;
#endif /* !HAVE_GETTIMEOFDAY */
#define BUFLEN 512
   char buff[BUFLEN], *bufp, *syslp;
   size_t bytes;
   va_list ap;

   DIAG_INIT;
   if (level < diagopts.msglevel)  return;
   va_start(ap, format);
#if HAVE_GETTIMEOFDAY || 1
   result = gettimeofday(&now, NULL);
   if (result < 0) {
      /* invoking msg() might create endless recursion; by hand instead */
      sprintf(buff, "cannot read time:   %s["F_pid".%lu] E %s",
	      diagopts.progname, getpid(), (unsigned long)pthread_self(), strerror(errno));
      _msg(LOG_ERR, buff, strstr(buff, " E "+1));
      strcpy(buff, "unknown time        ");  bytes = 20;
   } else {
      nowt = now.tv_sec;
#if HAVE_STRFTIME
      if (diagopts.micros) {
	 bytes = strftime(buff, 20, "%Y/%m/%d %H:%M:%S", localtime(&nowt));
	 bytes += sprintf(buff+19, "."F_tv_usec" ", now.tv_usec);
      } else {
	 bytes =
	    strftime(buff, 21, "%Y/%m/%d %H:%M:%S ", localtime(&nowt));
      }
#else
      strcpy(buff, ctime(&nowt));
      bytes = strlen(buff);
#endif
   }
#else /* !HAVE_GETTIMEOFDAY */
   now = time(NULL);  if (now == (time_t)-1) {
      /* invoking msg() might create endless recursion; by hand instead */
      sprintf(buff, "cannot read time:   %s["F_pid"] E %s",
	      diagopts.progname, getpid(), strerror(errno));
      _msg(LOG_ERR, buff, strstr(buff, " E "+1));
      strcpy(buff, "unknown time        ");  bytes = 20;
   } else {
#if HAVE_STRFTIME
      bytes = strftime(buff, 21, "%Y/%m/%d %H:%M:%S ", localtime(&now));
#else
      strcpy(buff, ctime(&now));
      bytes = strlen(buff);
#endif
   }
#endif /* !HAVE_GETTIMEOFDAY */
   bufp = buff + bytes;
   if (diagopts.withhostname) {
      bytes = sprintf(bufp, "%s ", diagopts.hostname), bufp+=bytes;
   }
   bytes = sprintf(bufp, "%s["F_pid".%lu] ",
		   diagopts.progname, getpid(), (unsigned long)pthread_self());
   bufp += bytes;
   syslp = bufp;
   *bufp++ = "DINWEF"[level];
   *bufp++ = ' ';
   vsnprintf(bufp, BUFLEN-(bufp-buff)-1, format, ap);
   strcat(bufp, "\n");
   _msg(level, buff, syslp);
   if (level >= diagopts.exitlevel) {
      va_end(ap);
      if (E_NOTICE >= diagopts.msglevel) {
	 sprintf(syslp, "N exit(1)\n");
	 _msg(E_NOTICE, buff, syslp);
      }
      exit(diagopts.exitstatus ? diagopts.exitstatus : 1);
   }
   va_end(ap);
}
Exemplo n.º 17
0
// Differs from _bpdl because no named-sections and assumes all symbols
// pre-exist in symbol-table
//
mword *inline_bpdl(bvm_cache *this_bvm, mword *sexpr){ // inline_bpdl#

#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_trace;
#endif

    if(is_nil(sexpr)){
        return nil;
    }

    mword bpdl_list_type = get_bpdl_list_type(sexpr);

    switch(bpdl_list_type){

        case BPDL_LIST_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_LIST_LIST");
#endif
            return inline_bpdl_list_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_CODE_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_CODE_LIST");
#endif
            return inline_bpdl_code_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_SHORT_VAL_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_SHORT_VAL_LIST");
#endif
            return inline_bpdl_val_list(this_bvm, sexpr);


        case BPDL_VAL_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_VAL_LIST");
#endif
            return inline_bpdl_val_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_SHORT_PTR_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_SHORT_PTR_LIST");
#endif
            return inline_bpdl_ptr_list(this_bvm, sexpr);


        case BPDL_PTR_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_PTR_LIST");
#endif
            return inline_bpdl_ptr_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_TAG_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_TAG_LIST");
#endif
            return inline_bpdl_tag_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_HASH_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_HASH_LIST");
#endif
            return inline_bpdl_hash_list(this_bvm, (mword*)icdr(sexpr));


        case BPDL_SYM_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_SYM_LIST");
#endif
            //inline_bpdl_sym_list(this_bvm, (mword*)icdr(sexpr));
            return nil;


        case BPDL_BS_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_BS_LIST");
#endif
            return nil; // XXX UNIMPLEMENTED

        case BPDL_QW_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_QW_LIST");
#endif
            return nil; // XXX UNIMPLEMENTED

        case BPDL_SEXPR_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_SEXPR_LIST");
#endif
            return (mword*)icar((mword*)icdr(sexpr));

        case BPDL_LABEL_LIST:
#if(defined BPDL_TRACE || defined INLINE_BPDL_TRACE)
_msg("BPDL_LABEL_LIST");
#endif
// XXX macros go here ... XXX

//            return bpdl_lookup_label(this_bvm, (mword*)icar(sexpr));
            return inline_bpdl_label_list(this_bvm, sexpr);

        default: // BPDL_UNKNOWN_LIST
            _msg("Unrecognized list type");
            _dump(sexpr);
            _die;

    }

    return nil;

}
Exemplo n.º 18
0
static void _warn (const char *format, ...) {
	va_list v;
	va_start(v, format);
	_msg("WARNING", format, v);
	va_end(v);
}
Exemplo n.º 19
0
void msg2(
#if HAVE_CLOCK_GETTIME
	  struct timespec *now,
#elif HAVE_GETTIMEOFDAY
	  struct timeval *now,
#else
	  time_t *now,
#endif
	  int level,		/* E_INFO... */
	  int exitcode,		/* on exit use this exit code */
	  int handler,		/* message comes from signal handler */
	  const char *text) {
   time_t epoch;
   unsigned long micros;
#if HAVE_STRFTIME
   struct tm struct_tm;
#endif
#define BUFLEN 512
   char buff[BUFLEN], *bufp, *syslp;
   size_t bytes;

#if HAVE_CLOCK_GETTIME
   epoch = now->tv_sec;
#elif HAVE_GETTIMEOFDAY
   epoch = now->tv_sec;
#else
   epoch = *now;
#endif
#if HAVE_STRFTIME
   bytes = strftime(buff, 20, "%Y/%m/%d %H:%M:%S", localtime_r(&epoch, &struct_tm));
   buff[bytes] = '\0';
#else
   bytes = snprintf(buff, 11, F_time, epoch);
#endif
   if (diagopts.micros) {
#if HAVE_CLOCK_GETTIME
      micros = now->tv_nsec/1000;
#elif HAVE_GETTIMEOFDAY
      micros = now->tv_usec;
#else
      micros = 0;
#endif
      bytes += sprintf(buff+19, ".%06lu ", micros);
   } else {
      buff[19] = ' '; buff[20] = '\0';
   }
   bytes = strlen(buff);

   bufp = buff + bytes;
   if (diagopts.withhostname) {
      bytes = sprintf(bufp, "%s ", diagopts.hostname), bufp+=bytes;
   }
   bytes = sprintf(bufp, "%s["F_pid"] ", diagopts.progname, getpid());
   bufp += bytes;
   syslp = bufp;
   *bufp++ = "DINWEF"[level];
#if 0 /* only for debugging socat */
   if (handler)  bufp[-1] = tolower(bufp[-1]); /* for debugging, low chars indicate messages from signal handlers */
#endif
   *bufp++ = ' ';
   strncpy(bufp, text, BUFLEN-(bufp-buff)-1);
   strcat(bufp, "\n");
   _msg(level, buff, syslp);
   if (level >= diagopts.exitlevel) {
      if (E_NOTICE >= diagopts.msglevel) {
	 snprintf_r(syslp, 16, "N exit(%d)\n", exitcode?exitcode:(diagopts.exitstatus?diagopts.exitstatus:1));
	 _msg(E_NOTICE, buff, syslp);
      }
      exit(exitcode?exitcode:(diagopts.exitstatus?diagopts.exitstatus:1));
   }
}
Exemplo n.º 20
0
int main(int argc, char **argv)
{
	struct engine *engine = NULL;
	Display *dpy;
	int num;
	XSetWindowAttributes attr;
	unsigned long mask;
	Window root;
	Window win;
	XVisualInfo *info = NULL;
	GLXContext ctx  = NULL;
	int conf[] = { GLX_RGBA,
		GLX_RED_SIZE, 1,
		GLX_GREEN_SIZE, 1,
		GLX_BLUE_SIZE, 1,
		GLX_DOUBLEBUFFER, GL_FALSE,
		GLX_DEPTH_SIZE, 1,
		None,
	};

	dpy = XOpenDisplay(NULL);
	if (!dpy) {
		_err("failed to open X display\n");
		return 1;
	}

	num = DefaultScreen(dpy);
	_inf("use GLX_SGIX_pbuffer on screen %d\n", num);

	root = RootWindow(dpy, num);
	info = glXChooseVisual(dpy, num, conf);
	if (!info) {
		_err("glXChooseVisual() failed\n");
		goto out;
	}

	/* window attributes */
	attr.border_pixel = 0;
	attr.colormap = XCreateColormap(dpy, root, info->visual, AllocNone);
	attr.event_mask = ButtonPressMask | ExposureMask | KeyPressMask;
	mask = CWBorderPixel | CWColormap | CWEventMask;

	win = XCreateWindow(dpy, root, 0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT,
		0, info->depth, InputOutput, info->visual, mask, &attr);

	ctx = glXCreateContext(dpy, info, NULL, GL_TRUE);
	if (!ctx) {
		_err("glXCreateContext() failed\n");
		goto out;
	}

	XFree(info);
	info = NULL;
	XMapWindow(dpy, win);

	_msg("call glXMakeCurrent()\n");
	glXMakeCurrent(dpy, win, ctx);

	_inf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
	_inf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
	_inf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
	_inf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
	_inf("GL_SHADING_LANGUAGE_VERSION = %s\n",
		(char *) glGetString(GL_SHADING_LANGUAGE_VERSION));

	_msg("clear window\n");
	glClearColor(0, 0, 0, 1);
	glClear(GL_COLOR_BUFFER_BIT);
	glXSwapBuffers(dpy, win);

	_msg("init engine\n");
	if (engine_init(&engine, argc, argv) < 0) {
		_err("engine_init() failed\n");
		goto out;
	}

	_msg("start engine\n");
	engine_start(engine);

	glXSwapBuffers(dpy, win);

	engine_stop(engine);
	event_loop(dpy);

	_msg("exit engine\n");
	engine_exit(&engine);

out:
	glXMakeCurrent(dpy, 0, 0);

	if (info)
		XFree(info);

	if (ctx)
		glXDestroyContext(dpy, ctx);

	XDestroyWindow(dpy, win);
	XCloseDisplay(dpy);

	return 0;
}