summaryrefslogtreecommitdiffstats
path: root/kghostview/dscparse_adapter.h
diff options
context:
space:
mode:
Diffstat (limited to 'kghostview/dscparse_adapter.h')
-rw-r--r--kghostview/dscparse_adapter.h386
1 files changed, 386 insertions, 0 deletions
diff --git a/kghostview/dscparse_adapter.h b/kghostview/dscparse_adapter.h
new file mode 100644
index 00000000..9e41f3c2
--- /dev/null
+++ b/kghostview/dscparse_adapter.h
@@ -0,0 +1,386 @@
+/**
+ * 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.
+ */
+
+#ifndef DSCPARSE_ADAPTER_H
+#define DSCPARSE_ADAPTER_H
+
+#include <iostream>
+#include <map>
+#include <memory>
+
+#include <qsize.h>
+#include <qstring.h>
+
+#include "dscparse.h"
+
+#if defined(__GNUC__)
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 93)
+/*
+ * We add a quick 'n' dirty inline implementation of auto_ptr for older
+ * releases of GCC, which don't include an auto_ptr implementation in
+ * <memory>.
+ */
+
+template <class T> class auto_ptr {
+private:
+ T* _ptr;
+
+public:
+ typedef T element_type;
+ explicit auto_ptr(T* p = 0) : _ptr(p) {}
+ auto_ptr(auto_ptr& a) : _ptr(a.release()) {}
+ template <class T1> auto_ptr(auto_ptr<T1>& a) : _ptr(a.release()) {}
+ auto_ptr& operator=(auto_ptr& a) {
+ if (&a != this) {
+ delete _ptr;
+ _ptr = a.release();
+ }
+ return *this;
+ }
+ template <class T1>
+ auto_ptr& operator=(auto_ptr<T1>& a) {
+ if (a.get() != this->get()) {
+ delete _ptr;
+ _ptr = a.release();
+ }
+ return *this;
+ }
+ ~auto_ptr() { delete _ptr; }
+
+ T& operator*() const { return *_ptr; }
+ T* operator->() const { return _ptr; }
+ T* get() const { return _ptr; }
+ T* release() { T* tmp = _ptr; _ptr = 0; return tmp; }
+ void reset(T* p = 0) { delete _ptr; _ptr = p; }
+};
+
+#endif
+#endif
+
+
+class KDSCBBOX
+{
+public:
+ KDSCBBOX();
+ KDSCBBOX( const KDSCBBOX& b );
+ KDSCBBOX( int llx, int lly, int urx, int ury );
+ KDSCBBOX( const CDSCBBOX& bbox );
+
+ KDSCBBOX& operator = ( const KDSCBBOX& b );
+
+ bool operator == ( const KDSCBBOX& b );
+ bool operator != ( const KDSCBBOX& b );
+
+ int llx() const;
+ int lly() const;
+ int urx() const;
+ int ury() const;
+
+ int width() const;
+ int height() const;
+
+ QSize size() const;
+
+private:
+ int _llx, _lly, _urx, _ury;
+};
+
+std::ostream& operator << ( std::ostream&, const KDSCBBOX& );
+
+
+class KDSCError
+{
+public:
+ enum Type
+ {
+ BBox = CDSC_MESSAGE_BBOX,
+ EarlyTrailer = CDSC_MESSAGE_EARLY_TRAILER,
+ EarlyEOF = CDSC_MESSAGE_EARLY_EOF,
+ PageInTrailer = CDSC_MESSAGE_PAGE_IN_TRAILER,
+ PageOrdinal = CDSC_MESSAGE_PAGE_ORDINAL,
+ PagesWrong = CDSC_MESSAGE_PAGES_WRONG,
+ EPSNoBBox = CDSC_MESSAGE_EPS_NO_BBOX,
+ EPSPages = CDSC_MESSAGE_EPS_PAGES,
+ NoMedia = CDSC_MESSAGE_NO_MEDIA,
+ AtEnd = CDSC_MESSAGE_ATEND,
+ DuplicateComment = CDSC_MESSAGE_DUP_COMMENT,
+ DuplicateTrailer = CDSC_MESSAGE_DUP_TRAILER,
+ BeginEnd = CDSC_MESSAGE_BEGIN_END,
+ BadSection = CDSC_MESSAGE_BAD_SECTION,
+ LongLine = CDSC_MESSAGE_LONG_LINE,
+ IncorrectUsage = CDSC_MESSAGE_INCORRECT_USAGE
+ };
+
+ enum Severity
+ {
+ Information = CDSC_ERROR_INFORM,
+ Warning = CDSC_ERROR_WARN,
+ Error = CDSC_ERROR_ERROR
+ };
+
+ KDSCError( Type, Severity, const QCString& line,
+ unsigned int lineNumber );
+
+ Type type() const;
+ Severity severity() const;
+ QCString line() const;
+ unsigned int lineNumber() const;
+
+private:
+ Type _type;
+ Severity _severity;
+ QCString _line;
+ unsigned int _lineNumber;
+};
+
+
+class KDSCErrorHandler
+{
+public:
+ virtual ~KDSCErrorHandler() {}
+ enum Response
+ {
+ Ok = CDSC_RESPONSE_OK,
+ Cancel = CDSC_RESPONSE_CANCEL,
+ IgnoreAll = CDSC_RESPONSE_IGNORE_ALL
+ };
+
+ virtual Response error( const KDSCError& ) = 0;
+};
+
+class KDSCOkErrorHandler : public KDSCErrorHandler
+{
+ Response error( const KDSCError& );
+};
+
+class KDSCCommentHandler
+{
+public:
+ virtual ~KDSCCommentHandler() {}
+ enum Name
+ {
+ // Header section
+ PSAdobe = CDSC_PSADOBE,
+ BeginComments = CDSC_BEGINCOMMENTS,
+ EndComments = CDSC_ENDCOMMENTS,
+ Pages = CDSC_PAGES,
+ Creator = CDSC_CREATOR,
+ CreationDate = CDSC_CREATIONDATE,
+ Title = CDSC_TITLE,
+ For = CDSC_FOR,
+ LanguageLevel = CDSC_LANGUAGELEVEL,
+ BoundingBox = CDSC_BOUNDINGBOX,
+ Orientation = CDSC_ORIENTATION,
+ PageOrder = CDSC_PAGEORDER,
+ DocumentMedia = CDSC_DOCUMENTMEDIA,
+ DocumentPaperSizes = CDSC_DOCUMENTPAPERSIZES,
+ DocumentPaperForms = CDSC_DOCUMENTPAPERFORMS,
+ DocumentPaperColors = CDSC_DOCUMENTPAPERCOLORS,
+ DocumentPaperWeights = CDSC_DOCUMENTPAPERWEIGHTS,
+ DocumentData = CDSC_DOCUMENTDATA,
+ Requirements = CDSC_REQUIREMENTS,
+ DocumentNeededFonts = CDSC_DOCUMENTNEEDEDFONTS,
+ DocumentSuppliedFonts = CDSC_DOCUMENTSUPPLIEDFONTS,
+ HiResBoundingBox = CDSC_HIRESBOUNDINGBOX,
+ CropBox = CDSC_CROPBOX,
+
+ // Preview section
+ BeginPreview = CDSC_BEGINPREVIEW,
+ EndPreview = CDSC_ENDPREVIEW,
+
+ // Defaults section
+ BeginDefaults = CDSC_BEGINDEFAULTS,
+ EndDefaults = CDSC_ENDDEFAULTS,
+ // also %%PageMedia, %%PageOrientation, %%PageBoundingBox
+
+ // Prolog section
+ BeginProlog = CDSC_BEGINPROLOG,
+ EndProlog = CDSC_ENDPROLOG,
+ BeginFont = CDSC_BEGINFONT,
+ EndFont = CDSC_ENDFONT,
+ BeginFeature = CDSC_BEGINFEATURE,
+ EndFeature = CDSC_ENDFEATURE,
+ BeginResource = CDSC_BEGINRESOURCE,
+ EndResource = CDSC_ENDRESOURCE,
+ BeginProcset = CDSC_BEGINPROCSET,
+ EndProcset = CDSC_ENDPROCSET,
+
+ // Setup section
+ BeginSetup = CDSC_BEGINSETUP,
+ EndSetup = CDSC_ENDSETUP,
+ Feature = CDSC_FEATURE,
+ PaperColor = CDSC_PAPERCOLOR,
+ PaperForm = CDSC_PAPERFORM,
+ PaperWeight = CDSC_PAPERWEIGHT,
+ PaperSize = CDSC_PAPERSIZE,
+ // also %%Begin/EndFeature, %%Begin/EndResource
+
+ // Page section
+ Page = CDSC_PAGE,
+ PageTrailer = CDSC_PAGETRAILER,
+ BeginPageSetup = CDSC_BEGINPAGESETUP,
+ EndPageSetup = CDSC_ENDPAGESETUP,
+ PageMedia = CDSC_PAGEMEDIA,
+ // also %%PaperColor, %%PaperForm, %%PaperWeight, %%PaperSize
+ PageOrientation = CDSC_PAGEORIENTATION,
+ PageBoundingBox = CDSC_PAGEBOUNDINGBOX,
+ // also %%Begin/EndFont, %%Begin/EndFeature
+ // also %%Begin/EndResource, %%Begin/EndProcSet
+ IncludeFont = CDSC_INCLUDEFONT,
+ ViewingOrientation = CDSC_VIEWINGORIENTATION,
+
+ // Trailer section
+ Trailer = CDSC_TRAILER,
+ // also %%Pages, %%BoundingBox, %%Orientation, %%PageOrder,
+ // %%DocumentMedia
+ // %%Page is recognised as an error
+ // also %%DocumentNeededFonts, %%DocumentSuppliedFonts
+
+ // End of File */
+ Eof = CDSC_EOF
+ };
+
+ virtual void comment( Name name ) { std::cout << name << std::endl; }
+};
+
+class KDSCScanHandler;
+class KDSC
+{
+public:
+ KDSC();
+ ~KDSC();
+
+ /*--- Adapter for CDSC ------------------------------------------------*/
+ QString dsc_version() const;
+
+ bool dsc() const;
+ bool ctrld() const;
+ bool pjl() const;
+ bool epsf() const;
+ bool pdf() const;
+
+ unsigned int preview() const;
+ unsigned int language_level() const;
+ unsigned int document_data() const;
+
+ unsigned long begincomments() const;
+ unsigned long endcomments() const;
+ unsigned long beginpreview() const;
+ unsigned long endpreview() const;
+ unsigned long begindefaults() const;
+ unsigned long enddefaults() const;
+ unsigned long beginprolog() const;
+ unsigned long endprolog() const;
+ unsigned long beginsetup() const;
+ unsigned long endsetup() const;
+ unsigned long begintrailer() const;
+ unsigned long endtrailer() const;
+
+ CDSCPAGE* page() const;
+
+ unsigned int page_count() const;
+ unsigned int page_pages() const;
+ unsigned int page_order() const;
+ unsigned int page_orientation() const;
+
+ CDSCCTM* viewing_orientation() const;
+
+ unsigned int media_count() const;
+ CDSCMEDIA** media() const;
+ const CDSCMEDIA* page_media() const;
+
+#if defined(__GNUC__) && (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 93))
+ auto_ptr<KDSCBBOX> bbox() const;
+ auto_ptr<KDSCBBOX> page_bbox() const;
+#else
+ std::auto_ptr<KDSCBBOX> bbox() const;
+ std::auto_ptr<KDSCBBOX> page_bbox() const;
+#endif
+
+ // CDSCDOSEPS *doseps;
+
+ QString dsc_title() const;
+ QString dsc_creator() const;
+ QString dsc_date() const;
+ QString dsc_for() const;
+
+ // unsigned int max_error
+
+ bool scanData( char*, unsigned int );
+
+ /**
+ * Tidy up from incorrect DSC comments.
+ */
+ int fixup();
+
+ KDSCErrorHandler* errorHandler() const;
+ void setErrorHandler( KDSCErrorHandler* );
+
+ KDSCCommentHandler* commentHandler() const;
+ void setCommentHandler( KDSCCommentHandler* );
+
+ /*--- Extra methods for convenience -----------------------------------*/
+ bool isStructured() const;
+
+ /*--- Temporary -------------------------------------------------------*/
+ CDSC* cdsc() const;
+
+protected:
+ static int errorFunction( void* caller_data, CDSC* dsc,
+ unsigned int explanation,
+ const char* line, unsigned int line_len );
+
+private:
+ CDSC* _cdsc;
+ KDSCErrorHandler* _errorHandler;
+ KDSCCommentHandler* _commentHandler;
+ KDSCScanHandler* _scanHandler;
+};
+
+class KDSCScanHandler
+{
+public:
+ virtual ~KDSCScanHandler() {}
+ KDSCScanHandler( CDSC* cdsc ) : _cdsc( cdsc ) {}
+
+ virtual bool scanData( char* buf, unsigned int count )
+ {
+ return ( dsc_scan_data( _cdsc, buf, count ) >= 0 );
+ }
+
+protected:
+ CDSC* _cdsc;
+};
+
+class KDSCScanHandlerByLine : public KDSCScanHandler
+{
+public:
+ KDSCScanHandlerByLine( CDSC* cdsc, KDSCCommentHandler* commentHandler ) :
+ KDSCScanHandler( cdsc ),
+ _commentHandler( commentHandler )
+ {}
+
+ virtual bool scanData( char* buf, unsigned int count );
+
+protected:
+ KDSCCommentHandler* _commentHandler;
+};
+
+#endif
+
+// vim:sw=4:sts=4:ts=8:noet