summaryrefslogtreecommitdiffstats
path: root/kghostview/dscparse_adapter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kghostview/dscparse_adapter.cpp')
-rw-r--r--kghostview/dscparse_adapter.cpp420
1 files changed, 420 insertions, 0 deletions
diff --git a/kghostview/dscparse_adapter.cpp b/kghostview/dscparse_adapter.cpp
new file mode 100644
index 00000000..4db450bb
--- /dev/null
+++ b/kghostview/dscparse_adapter.cpp
@@ -0,0 +1,420 @@
+/**
+ * Copyright (C) 2001 the KGhostView authors. See file AUTHORS.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "dscparse_adapter.h"
+
+using namespace std;
+
+/*-- KDSCBBOX implementation -----------------------------------------------*/
+
+KDSCBBOX::KDSCBBOX() :
+ _llx( 0 ), _lly( 0 ),
+ _urx( 0 ), _ury( 0 )
+{}
+
+KDSCBBOX::KDSCBBOX( const KDSCBBOX& b ) :
+ _llx( b._llx ), _lly( b._lly ),
+ _urx( b._urx ), _ury( b._ury )
+{}
+
+KDSCBBOX::KDSCBBOX( int llx, int lly, int urx, int ury ) :
+ _llx( llx ), _lly( lly ),
+ _urx( urx ), _ury( ury )
+{}
+
+KDSCBBOX::KDSCBBOX( const CDSCBBOX& bbox ) :
+ _llx( bbox.llx ), _lly( bbox.lly ),
+ _urx( bbox.urx ), _ury( bbox.ury )
+{}
+
+KDSCBBOX& KDSCBBOX::operator = ( const KDSCBBOX& b )
+{
+ _llx = b._llx; _lly = b._lly; _urx = b._urx; _ury = b._ury;
+ return *this;
+}
+
+bool KDSCBBOX::operator == ( const KDSCBBOX& b )
+{
+ return ( _llx == b._llx && _lly == b._lly
+ && _urx == b._urx && _ury == b._ury );
+}
+
+bool KDSCBBOX::operator != ( const KDSCBBOX& b )
+{
+ return !( *this == b );
+}
+
+int KDSCBBOX::llx() const { return _llx; }
+int KDSCBBOX::lly() const { return _lly; }
+int KDSCBBOX::urx() const { return _urx; }
+int KDSCBBOX::ury() const { return _ury; }
+
+int KDSCBBOX::width() const { return _urx - _llx; }
+int KDSCBBOX::height() const { return _ury - _lly; }
+
+QSize KDSCBBOX::size() const { return QSize( width(), height() ); }
+
+ostream& operator << ( ostream& os, const KDSCBBOX& source )
+{
+ os << "{ llx: "<< source.llx() << ", lly: " << source.lly()
+ << " urx: "<< source.urx() << ", ury: " << source.ury() << " }";
+ return os;
+}
+
+/*-- KDSCError implementation ----------------------------------------------*/
+
+KDSCError::KDSCError( Type type, Severity severity, const QCString& line,
+ unsigned int lineNumber ) :
+ _type( type ),
+ _severity( severity ),
+ _line( line ),
+ _lineNumber( lineNumber )
+{}
+
+KDSCError::Type KDSCError::type() const
+{
+ return _type;
+}
+
+KDSCError::Severity KDSCError::severity() const
+{
+ return _severity;
+}
+
+QCString KDSCError::line() const
+{
+ return _line;
+}
+
+unsigned int KDSCError::lineNumber() const
+{
+ return _lineNumber;
+}
+
+/*-- KDSCOkErrorHandler implementation -------------------------------------*/
+
+KDSCErrorHandler::Response KDSCOkErrorHandler::error( const KDSCError& err )
+{
+ cout << "KDSC: error in line " << err.lineNumber() << endl;
+ cout << err.line() << endl;
+ return Ok;
+}
+
+/*-- KDSC implementation ---------------------------------------------------*/
+
+KDSC::KDSC() :
+ _errorHandler( 0 ),
+ _commentHandler( 0 )
+{
+ _cdsc = dsc_init( this );
+ Q_ASSERT( _cdsc != 0 );
+ _scanHandler = new KDSCScanHandler( _cdsc );
+}
+
+KDSC::~KDSC()
+{
+ dsc_free( _cdsc );
+ delete _scanHandler;
+}
+
+QString KDSC::dsc_version() const
+{
+ return QString( _cdsc->dsc_version );
+}
+
+bool KDSC::dsc() const
+{
+ return ( _cdsc->dsc == TRUE );
+}
+
+bool KDSC::ctrld() const
+{
+ return ( _cdsc->ctrld == TRUE );
+}
+
+bool KDSC::pjl() const
+{
+ return ( _cdsc->pjl == TRUE );
+}
+
+bool KDSC::epsf() const
+{
+ return ( _cdsc->epsf == TRUE );
+}
+
+bool KDSC::pdf() const
+{
+ return ( _cdsc->pdf == TRUE );
+}
+
+unsigned int KDSC::preview() const
+{
+ return _cdsc->preview;
+}
+
+unsigned int KDSC::language_level() const
+{
+ return _cdsc->language_level;
+}
+
+unsigned int KDSC::document_data() const
+{
+ return _cdsc->document_data;
+}
+
+unsigned long KDSC::begincomments() const
+{
+ return _cdsc->begincomments;
+}
+
+unsigned long KDSC::endcomments() const
+{
+ return _cdsc->endcomments;
+}
+
+unsigned long KDSC::beginpreview() const
+{
+ return _cdsc->beginpreview;
+}
+
+unsigned long KDSC::endpreview() const
+{
+ return _cdsc->endpreview;
+}
+
+unsigned long KDSC::begindefaults() const
+{
+ return _cdsc->begindefaults;
+}
+
+unsigned long KDSC::enddefaults() const
+{
+ return _cdsc->enddefaults;
+}
+
+unsigned long KDSC::beginprolog() const
+{
+ return _cdsc->beginprolog;
+}
+
+unsigned long KDSC::endprolog() const
+{
+ return _cdsc->endprolog;
+}
+
+unsigned long KDSC::beginsetup() const
+{
+ return _cdsc->beginsetup;
+}
+
+unsigned long KDSC::endsetup() const
+{
+ return _cdsc->endsetup;
+}
+
+unsigned long KDSC::begintrailer() const
+{
+ return _cdsc->begintrailer;
+}
+
+unsigned long KDSC::endtrailer() const
+{
+ return _cdsc->endtrailer;
+}
+
+CDSCPAGE* KDSC::page() const
+{
+ return _cdsc->page;
+}
+
+unsigned int KDSC::page_count() const
+{
+ return _cdsc->page_count;
+}
+
+unsigned int KDSC::page_pages() const
+{
+ return _cdsc->page_pages;
+}
+
+unsigned int KDSC::page_order() const
+{
+ return _cdsc->page_order;
+}
+
+unsigned int KDSC::page_orientation() const
+{
+ return _cdsc->page_orientation;
+}
+
+CDSCCTM* KDSC::viewing_orientation() const
+{
+ return _cdsc->viewing_orientation;
+}
+
+unsigned int KDSC::media_count() const
+{
+ return _cdsc->media_count;
+}
+
+CDSCMEDIA** KDSC::media() const
+{
+ return _cdsc->media;
+}
+
+const CDSCMEDIA* KDSC::page_media() const
+{
+ return _cdsc->page_media;
+}
+
+auto_ptr<KDSCBBOX> KDSC::bbox() const
+{
+ if( _cdsc->bbox == 0 )
+ return auto_ptr<KDSCBBOX>( 0 );
+ else
+ return auto_ptr<KDSCBBOX>( new KDSCBBOX( *_cdsc->bbox ) );
+}
+
+auto_ptr<KDSCBBOX> KDSC::page_bbox() const
+{
+ if( _cdsc->page_bbox == 0 )
+ return auto_ptr<KDSCBBOX>( 0 );
+ else
+ return auto_ptr<KDSCBBOX>( new KDSCBBOX( *_cdsc->page_bbox ) );
+}
+
+QString KDSC::dsc_title() const
+{
+ return QString( _cdsc->dsc_title );
+}
+
+QString KDSC::dsc_creator() const
+{
+ return QString( _cdsc->dsc_creator );
+}
+
+QString KDSC::dsc_date() const
+{
+ return QString( _cdsc->dsc_date );
+}
+
+QString KDSC::dsc_for() const
+{
+ return QString( _cdsc->dsc_for );
+}
+
+bool KDSC::scanData( char* buffer, unsigned int count )
+{
+ return _scanHandler->scanData( buffer, count );
+}
+
+int KDSC::fixup()
+{
+ return dsc_fixup( _cdsc );
+}
+
+KDSCErrorHandler* KDSC::errorHandler() const
+{
+ return _errorHandler;
+}
+
+void KDSC::setErrorHandler( KDSCErrorHandler* errorHandler )
+{
+ _errorHandler = errorHandler;
+ if( errorHandler == 0 )
+ dsc_set_error_function( _cdsc, 0 );
+ else
+ dsc_set_error_function( _cdsc, &errorFunction );
+}
+
+KDSCCommentHandler* KDSC::commentHandler() const
+{
+ return _commentHandler;
+}
+
+void KDSC::setCommentHandler( KDSCCommentHandler* commentHandler )
+{
+ if( _commentHandler != 0 && commentHandler == 0 )
+ {
+ delete _scanHandler;
+ _scanHandler = new KDSCScanHandler( _cdsc );
+ }
+ else if( _commentHandler == 0 && commentHandler != 0 )
+ {
+ delete _scanHandler;
+ _scanHandler = new KDSCScanHandlerByLine( _cdsc, commentHandler );
+ }
+ _commentHandler = commentHandler;
+}
+
+bool KDSC::isStructured() const
+{
+ return epsf() ? ( page_count() > 1 ) : ( page_count() > 0 );
+}
+
+CDSC* KDSC::cdsc() const
+{
+ return _cdsc;
+}
+
+int KDSC::errorFunction( void* caller_data, CDSC* dsc,
+ unsigned int explanation, const char* line, unsigned int line_len )
+{
+ KDSCError error(
+ static_cast< KDSCError::Type >( explanation ),
+ static_cast< KDSCError::Severity >( dsc->severity[explanation] ),
+ QCString( line, line_len + 1 ),
+ dsc->line_count
+ );
+
+ KDSC* kdsc = static_cast< KDSC* >( caller_data );
+ Q_ASSERT( kdsc );
+
+ return kdsc->errorHandler()->error( error );
+}
+
+bool KDSCScanHandlerByLine::scanData( char* buf, unsigned int count )
+{
+ char* lineStart = buf;
+ char* it = buf;
+ while( it < buf + count )
+ {
+ if( *it++ == '\n' )
+ {
+ int retval = dsc_scan_data( _cdsc, lineStart, it - lineStart );
+ if( retval < 0 )
+ return false;
+ else if( retval > 0 )
+ {
+ _commentHandler->comment(
+ static_cast<KDSCCommentHandler::Name>( retval ) );
+ }
+ lineStart = it;
+ }
+ }
+
+ if( it != lineStart )
+ {
+ // Scan the remaining part of the string.
+ return ( dsc_scan_data( _cdsc, lineStart, it - lineStart ) < 0 );
+ }
+ else
+ return true;
+}
+
+// vim:sw=4:sts=4:ts=8:noet