1 /* Copyright (C) 2000-2003, Ghostgum Software Pty Ltd. All rights reserved. 2 3 This software is provided AS-IS with no warranty, either express or 4 implied. 5 6 This software is distributed under license and may not be copied, 7 modified or distributed except as expressly authorized under the terms 8 of the license contained in the file LICENSE in this distribution. 9 10 For more information about licensing, please refer to 11 http://www.ghostscript.com/licensing/. For information on 12 commercial licensing, go to http://www.artifex.com/licensing/ or 13 contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14 San Rafael, CA 94903, U.S.A., +1(415)492-9861. 15 */ 16 17 /* $Id: dscparse.h,v 1.12 2003/08/14 22:28:13 ghostgum Exp $*/ 18 /* Interface for the DSC parser. */ 19 20 #ifndef dscparse_INCLUDED 21 # define dscparse_INCLUDED 22 23 /* Some local types that may need modification */ 24 typedef int GSBOOL; 25 typedef unsigned long GSDWORD; /* must be at least 32 bits */ 26 typedef unsigned int GSWORD; /* must be at least 16 bits */ 27 28 #ifndef FALSE 29 # define FALSE ((GSBOOL)0) 30 # define TRUE ((GSBOOL)(!FALSE)) 31 #endif 32 33 /* DSC_OFFSET is an unsigned integer which holds the offset 34 * from the start of a file to a particular DSC comment, 35 * or the length of a file. 36 * Normally it is "unsigned long" which is commonly 32 bits. 37 * Change it if you need to handle larger files. 38 */ 39 #ifndef DSC_OFFSET 40 # define DSC_OFFSET unsigned long 41 #endif 42 #ifndef DSC_OFFSET_FORMAT 43 # define DSC_OFFSET_FORMAT "lu" /* for printf */ 44 #endif 45 46 #ifndef dsc_private 47 # ifdef private 48 # define dsc_private private 49 # else 50 # define dsc_private static 51 # endif 52 #endif 53 54 #ifndef min 55 # define min(a,b) ((a) < (b) ? (a) : (b)) 56 #endif 57 #ifndef max 58 # define max(a,b) ((a) > (b) ? (a) : (b)) 59 #endif 60 61 /* maximum legal length of lines in a DSC compliant file */ 62 #define DSC_LINE_LENGTH 255 63 64 /* memory for strings is allocated in chunks of this length */ 65 #define CDSC_STRING_CHUNK 4096 66 67 /* page array is allocated in chunks of this many pages */ 68 #define CDSC_PAGE_CHUNK 128 69 70 /* buffer length for storing lines passed to dsc_scan_data() */ 71 /* must be at least 2 * DSC_LINE_LENGTH */ 72 /* We choose 8192 as twice the length passed to us by GSview */ 73 #define CDSC_DATA_LENGTH 8192 74 75 /* Return codes from dsc_scan_data() 76 * < 0 = error 77 * >=0 = OK 78 * 79 * -1 = error, usually insufficient memory. 80 * 0-9 = normal 81 * 10-99 = internal codes, should not be seen. 82 * 100-999 = identifier of last DSC comment processed. 83 */ 84 85 typedef enum CDSC_RETURN_CODE_e { 86 CDSC_ERROR = -1, /* Fatal error, usually insufficient memory */ 87 88 CDSC_OK = 0, /* OK, no DSC comment found */ 89 CDSC_NOTDSC = 1, /* Not DSC, or DSC is being ignored */ 90 91 /* Any section */ 92 CDSC_UNKNOWNDSC = 100, /* DSC comment not recognised */ 93 94 /* Header section */ 95 CDSC_PSADOBE = 200, /* %!PS-Adobe- */ 96 CDSC_BEGINCOMMENTS = 201, /* %%BeginComments */ 97 CDSC_ENDCOMMENTS = 202, /* %%EndComments */ 98 CDSC_PAGES = 203, /* %%Pages: */ 99 CDSC_CREATOR = 204, /* %%Creator: */ 100 CDSC_CREATIONDATE = 205, /* %%CreationDate: */ 101 CDSC_TITLE = 206, /* %%Title: */ 102 CDSC_FOR = 207, /* %%For: */ 103 CDSC_LANGUAGELEVEL = 208, /* %%LanguageLevel: */ 104 CDSC_BOUNDINGBOX = 209, /* %%BoundingBox: */ 105 CDSC_ORIENTATION = 210, /* %%Orientation: */ 106 CDSC_PAGEORDER = 211, /* %%PageOrder: */ 107 CDSC_DOCUMENTMEDIA = 212, /* %%DocumentMedia: */ 108 CDSC_DOCUMENTPAPERSIZES = 213, /* %%DocumentPaperSizes: */ 109 CDSC_DOCUMENTPAPERFORMS = 214, /* %%DocumentPaperForms: */ 110 CDSC_DOCUMENTPAPERCOLORS = 215, /* %%DocumentPaperColors: */ 111 CDSC_DOCUMENTPAPERWEIGHTS = 216, /* %%DocumentPaperWeights: */ 112 CDSC_DOCUMENTDATA = 217, /* %%DocumentData: */ 113 CDSC_REQUIREMENTS = 218, /* IGNORED %%Requirements: */ 114 CDSC_DOCUMENTNEEDEDFONTS = 219, /* IGNORED %%DocumentNeededFonts: */ 115 CDSC_DOCUMENTSUPPLIEDFONTS = 220, /* IGNORED %%DocumentSuppliedFonts: */ 116 CDSC_HIRESBOUNDINGBOX = 221, /* %%HiResBoundingBox: */ 117 CDSC_CROPBOX = 222, /* %%CropBox: */ 118 CDSC_PLATEFILE = 223, /* %%PlateFile: (DCS 2.0) */ 119 CDSC_DOCUMENTPROCESSCOLORS = 224, /* %%DocumentProcessColors: */ 120 CDSC_DOCUMENTCUSTOMCOLORS = 225, /* %%DocumentCustomColors: */ 121 CDSC_CMYKCUSTOMCOLOR = 226, /* %%CMYKCustomColor: */ 122 CDSC_RGBCUSTOMCOLOR = 227, /* %%RGBCustomColor: */ 123 124 /* Preview section */ 125 CDSC_BEGINPREVIEW = 301, /* %%BeginPreview */ 126 CDSC_ENDPREVIEW = 302, /* %%EndPreview */ 127 128 /* Defaults section */ 129 CDSC_BEGINDEFAULTS = 401, /* %%BeginDefaults */ 130 CDSC_ENDDEFAULTS = 402, /* %%EndDefaults */ 131 /* also %%PageMedia, %%PageOrientation, %%PageBoundingBox */ 132 133 /* Prolog section */ 134 CDSC_BEGINPROLOG = 501, /* %%BeginProlog */ 135 CDSC_ENDPROLOG = 502, /* %%EndProlog */ 136 CDSC_BEGINFONT = 503, /* IGNORED %%BeginFont */ 137 CDSC_ENDFONT = 504, /* IGNORED %%EndFont */ 138 CDSC_BEGINFEATURE = 505, /* IGNORED %%BeginFeature */ 139 CDSC_ENDFEATURE = 506, /* IGNORED %%EndFeature */ 140 CDSC_BEGINRESOURCE = 507, /* IGNORED %%BeginResource */ 141 CDSC_ENDRESOURCE = 508, /* IGNORED %%EndResource */ 142 CDSC_BEGINPROCSET = 509, /* IGNORED %%BeginProcSet */ 143 CDSC_ENDPROCSET = 510, /* IGNORED %%EndProcSet */ 144 145 /* Setup section */ 146 CDSC_BEGINSETUP = 601, /* %%BeginSetup */ 147 CDSC_ENDSETUP = 602, /* %%EndSetup */ 148 CDSC_FEATURE = 603, /* IGNORED %%Feature: */ 149 CDSC_PAPERCOLOR = 604, /* IGNORED %%PaperColor: */ 150 CDSC_PAPERFORM = 605, /* IGNORED %%PaperForm: */ 151 CDSC_PAPERWEIGHT = 606, /* IGNORED %%PaperWeight: */ 152 CDSC_PAPERSIZE = 607, /* %%PaperSize: */ 153 /* also %%Begin/EndFeature, %%Begin/EndResource */ 154 155 /* Page section */ 156 CDSC_PAGE = 700, /* %%Page: */ 157 CDSC_PAGETRAILER = 701, /* IGNORED %%PageTrailer */ 158 CDSC_BEGINPAGESETUP = 702, /* IGNORED %%BeginPageSetup */ 159 CDSC_ENDPAGESETUP = 703, /* IGNORED %%EndPageSetup */ 160 CDSC_PAGEMEDIA = 704, /* %%PageMedia: */ 161 /* also %%PaperColor, %%PaperForm, %%PaperWeight, %%PaperSize */ 162 CDSC_PAGEORIENTATION = 705, /* %%PageOrientation: */ 163 CDSC_PAGEBOUNDINGBOX = 706, /* %%PageBoundingBox: */ 164 /* also %%Begin/EndFont, %%Begin/EndFeature */ 165 /* also %%Begin/EndResource, %%Begin/EndProcSet */ 166 CDSC_INCLUDEFONT = 707, /* IGNORED %%IncludeFont: */ 167 CDSC_VIEWINGORIENTATION = 708, /* %%ViewingOrientation: */ 168 CDSC_PAGECROPBOX = 709, /* %%PageCropBox: */ 169 170 /* Trailer section */ 171 CDSC_TRAILER = 800, /* %%Trailer */ 172 /* also %%Pages, %%BoundingBox, %%Orientation, %%PageOrder, %%DocumentMedia */ 173 /* %%Page is recognised as an error */ 174 /* also %%DocumentNeededFonts, %%DocumentSuppliedFonts */ 175 176 /* End of File */ 177 CDSC_EOF = 900 /* %%EOF */ 178 } CDSC_RETURN_CODE; 179 180 181 /* stored in dsc->preview */ 182 typedef enum CDSC_PREVIEW_TYPE_e { 183 CDSC_NOPREVIEW = 0, 184 CDSC_EPSI = 1, 185 CDSC_TIFF = 2, 186 CDSC_WMF = 3, 187 CDSC_PICT = 4 188 } CDSC_PREVIEW_TYPE; 189 190 /* stored in dsc->page_order */ 191 typedef enum CDSC_PAGE_ORDER_e { 192 CDSC_ORDER_UNKNOWN = 0, 193 CDSC_ASCEND = 1, 194 CDSC_DESCEND = 2, 195 CDSC_SPECIAL = 3 196 } CDSC_PAGE_ORDER; 197 198 /* stored in dsc->page_orientation and dsc->page[pagenum-1].orientation */ 199 typedef enum CDSC_ORIENTATION_ENUM_e { 200 CDSC_ORIENT_UNKNOWN = 0, 201 CDSC_PORTRAIT = 1, 202 CDSC_LANDSCAPE = 2, 203 CDSC_UPSIDEDOWN = 3, 204 CDSC_SEASCAPE = 4 205 } CDSC_ORIENTATION_ENUM; 206 207 /* stored in dsc->document_data */ 208 typedef enum CDSC_DOCUMENT_DATA_e { 209 CDSC_DATA_UNKNOWN = 0, 210 CDSC_CLEAN7BIT = 1, 211 CDSC_CLEAN8BIT = 2, 212 CDSC_BINARY = 3 213 } CDSC_DOCUMENT_DATA ; 214 215 typedef struct CDSCBBOX_S { 216 int llx; 217 int lly; 218 int urx; 219 int ury; 220 } CDSCBBOX; 221 222 typedef struct CDSCFBBOX_S { 223 float fllx; 224 float flly; 225 float furx; 226 float fury; 227 } CDSCFBBOX; 228 229 typedef struct CDSCMEDIA_S { 230 const char *name; 231 float width; /* PostScript points */ 232 float height; 233 float weight; /* GSM */ 234 const char *colour; 235 const char *type; 236 CDSCBBOX *mediabox; /* Used by GSview for PDF MediaBox */ 237 } CDSCMEDIA; 238 239 #define CDSC_KNOWN_MEDIA 11 240 extern const CDSCMEDIA dsc_known_media[CDSC_KNOWN_MEDIA]; 241 242 typedef struct CDSCCTM_S { /* used for %%ViewingOrientation */ 243 float xx; 244 float xy; 245 float yx; 246 float yy; 247 /* float ty; */ 248 /* float ty; */ 249 } CDSCCTM; 250 251 typedef struct CDSCPAGE_S { 252 int ordinal; 253 const char *label; 254 DSC_OFFSET begin; 255 DSC_OFFSET end; 256 unsigned int orientation; 257 const CDSCMEDIA *media; 258 CDSCBBOX *bbox; /* PageBoundingBox, also used by GSview for PDF CropBox */ 259 CDSCCTM *viewing_orientation; 260 /* Added 2001-10-19 */ 261 CDSCFBBOX *crop_box; /* CropBox */ 262 } CDSCPAGE; 263 264 /* binary DOS EPS header */ 265 typedef struct CDSCDOSEPS_S { 266 GSDWORD ps_begin; 267 GSDWORD ps_length; 268 GSDWORD wmf_begin; 269 GSDWORD wmf_length; 270 GSDWORD tiff_begin; 271 GSDWORD tiff_length; 272 GSWORD checksum; 273 } CDSCDOSEPS; 274 275 /* macbinary header */ 276 typedef struct CDSCMACBIN_S { 277 GSDWORD data_begin; /* EPS */ 278 GSDWORD data_length; 279 GSDWORD resource_begin; /* PICT */ 280 GSDWORD resource_length; 281 } CDSCMACBIN; 282 283 /* rather than allocated every string with malloc, we allocate 284 * chunks of 4k and place the (usually) short strings in these 285 * chunks. 286 */ 287 typedef struct CDSCSTRING_S CDSCSTRING; 288 struct CDSCSTRING_S { 289 unsigned int index; 290 unsigned int length; 291 char *data; 292 CDSCSTRING *next; 293 }; 294 295 /* Desktop Color Separations - DCS 2.0 */ 296 typedef struct CDCS2_S CDCS2; 297 struct CDCS2_S { 298 char *colourname; 299 char *filetype; /* Usually EPS */ 300 /* For multiple file DCS, location and filename will be set */ 301 char *location; /* Local or NULL */ 302 char *filename; 303 /* For single file DCS, begin will be not equals to end */ 304 DSC_OFFSET begin; 305 DSC_OFFSET end; 306 /* We maintain the separations as a linked list */ 307 CDCS2 *next; 308 }; 309 310 typedef enum CDSC_COLOUR_TYPE_e { 311 CDSC_COLOUR_UNKNOWN=0, 312 CDSC_COLOUR_PROCESS=1, /* %%DocumentProcessColors: */ 313 CDSC_COLOUR_CUSTOM=2 /* %%DocumentCustomColors: */ 314 } CDSC_COLOUR_TYPE; 315 316 typedef enum CDSC_CUSTOM_COLOUR_e { 317 CDSC_CUSTOM_COLOUR_UNKNOWN=0, 318 CDSC_CUSTOM_COLOUR_RGB=1, /* %%RGBCustomColor: */ 319 CDSC_CUSTOM_COLOUR_CMYK=2 /* %%CMYKCustomColor: */ 320 } CDSC_CUSTOM_COLOUR; 321 322 typedef struct CDSCCOLOUR_S CDSCCOLOUR; 323 struct CDSCCOLOUR_S { 324 char *name; 325 CDSC_COLOUR_TYPE type; 326 CDSC_CUSTOM_COLOUR custom; 327 /* If custom is CDSC_CUSTOM_COLOUR_RGB, the next three are correct */ 328 float red; 329 float green; 330 float blue; 331 /* If colourtype is CDSC_CUSTOM_COLOUR_CMYK, the next four are correct */ 332 float cyan; 333 float magenta; 334 float yellow; 335 float black; 336 /* Next colour */ 337 CDSCCOLOUR *next; 338 }; 339 340 /* DSC error reporting */ 341 342 typedef enum CDSC_MESSAGE_ERROR_e { 343 CDSC_MESSAGE_BBOX = 0, 344 CDSC_MESSAGE_EARLY_TRAILER = 1, 345 CDSC_MESSAGE_EARLY_EOF = 2, 346 CDSC_MESSAGE_PAGE_IN_TRAILER = 3, 347 CDSC_MESSAGE_PAGE_ORDINAL = 4, 348 CDSC_MESSAGE_PAGES_WRONG = 5, 349 CDSC_MESSAGE_EPS_NO_BBOX = 6, 350 CDSC_MESSAGE_EPS_PAGES = 7, 351 CDSC_MESSAGE_NO_MEDIA = 8, 352 CDSC_MESSAGE_ATEND = 9, 353 CDSC_MESSAGE_DUP_COMMENT = 10, 354 CDSC_MESSAGE_DUP_TRAILER = 11, 355 CDSC_MESSAGE_BEGIN_END = 12, 356 CDSC_MESSAGE_BAD_SECTION = 13, 357 CDSC_MESSAGE_LONG_LINE = 14, 358 CDSC_MESSAGE_INCORRECT_USAGE = 15 359 } CDSC_MESSAGE_ERROR; 360 361 /* severity */ 362 typedef enum CDSC_MESSAGE_SEVERITY_e { 363 CDSC_ERROR_INFORM = 0, /* Not an error */ 364 CDSC_ERROR_WARN = 1, /* Not a DSC error itself, */ 365 CDSC_ERROR_ERROR = 2 /* DSC error */ 366 } CDSC_MESSAGE_SEVERITY; 367 368 /* response */ 369 typedef enum CDSC_RESPONSE_e { 370 CDSC_RESPONSE_OK = 0, 371 CDSC_RESPONSE_CANCEL = 1, 372 CDSC_RESPONSE_IGNORE_ALL = 2 373 } CDSC_RESPONSE; 374 375 extern const char * const dsc_message[]; 376 377 #ifndef CDSC_TYPEDEF 378 #define CDSC_TYPEDEF 379 typedef struct CDSC_s CDSC; 380 #endif 381 382 struct CDSC_s { 383 char dummy[1024]; 384 /* public data */ 385 GSBOOL dsc; /* TRUE if DSC comments found */ 386 GSBOOL ctrld; /* TRUE if has CTRLD at start of stream */ 387 GSBOOL pjl; /* TRUE if has HP PJL at start of stream */ 388 GSBOOL epsf; /* TRUE if EPSF */ 389 GSBOOL pdf; /* TRUE if Portable Document Format */ 390 unsigned int preview; /* enum CDSC_PREVIEW_TYPE */ 391 char *dsc_version; /* first line of file */ 392 unsigned int language_level; 393 unsigned int document_data; /* Clean7Bit, Clean8Bit, Binary */ 394 /* enum CDSC_DOCUMENT_DATA */ 395 /* DSC sections */ 396 DSC_OFFSET begincomments; 397 DSC_OFFSET endcomments; 398 DSC_OFFSET beginpreview; 399 DSC_OFFSET endpreview; 400 DSC_OFFSET begindefaults; 401 DSC_OFFSET enddefaults; 402 DSC_OFFSET beginprolog; 403 DSC_OFFSET endprolog; 404 DSC_OFFSET beginsetup; 405 DSC_OFFSET endsetup; 406 DSC_OFFSET begintrailer; 407 DSC_OFFSET endtrailer; 408 CDSCPAGE *page; 409 unsigned int page_count; /* number of %%Page: pages in document */ 410 unsigned int page_pages; /* number of pages in document from %%Pages: */ 411 unsigned int page_order; /* enum CDSC_PAGE_ORDER */ 412 unsigned int page_orientation; /* the default page orientation */ 413 /* enum CDSC_ORIENTATION */ 414 CDSCCTM *viewing_orientation; 415 unsigned int media_count; /* number of media items */ 416 CDSCMEDIA **media; /* the array of media */ 417 const CDSCMEDIA *page_media;/* the default page media */ 418 CDSCBBOX *bbox; /* the document bounding box */ 419 CDSCBBOX *page_bbox; /* the default page bounding box */ 420 CDSCDOSEPS *doseps; /* DOS binary header */ 421 char *dsc_title; 422 char *dsc_creator; 423 char *dsc_date; 424 char *dsc_for; 425 426 unsigned int max_error; /* highest error number that will be reported */ 427 const int *severity; /* array of severity values, one per error */ 428 429 430 /* private data */ 431 void *caller_data; /* pointer to be provided when calling */ 432 /* error and debug callbacks */ 433 int id; /* last DSC comment found */ 434 int scan_section; /* section currently being scanned */ 435 /* enum CDSC_SECTION */ 436 437 DSC_OFFSET doseps_end; /* ps_begin+ps_length, otherwise 0 */ 438 unsigned int page_chunk_length; /* number of pages allocated */ 439 DSC_OFFSET file_length; /* length of document */ 440 /* If provided we try to recognise %%Trailer and %%EOF */ 441 /* incorrectly embedded inside document. */ 442 /* We will not parse DSC comments beyond this point. */ 443 /* Can be left set to default value of 0 */ 444 int skip_document; /* recursion level of %%BeginDocument: */ 445 int skip_bytes; /* #bytes to ignore from BeginData: */ 446 /* or DOSEPS preview section */ 447 int skip_lines; /* #lines to ignore from BeginData: */ 448 GSBOOL skip_pjl; /* TRUE if skip PJL until first PS comment */ 449 int begin_font_count; /* recursion level of %%BeginFont */ 450 int begin_feature_count; /* recursion level of %%BeginFeature */ 451 int begin_resource_count; /* recursion level of %%BeginResource */ 452 int begin_procset_count; /* recursion level of %%BeginProcSet */ 453 454 /* buffer for input */ 455 char data[CDSC_DATA_LENGTH];/* start of buffer */ 456 unsigned int data_length; /* length of data in buffer */ 457 unsigned int data_index; /* offset to next char in buffer */ 458 DSC_OFFSET data_offset; /* offset from start of document */ 459 /* to byte in data[0] */ 460 GSBOOL eof; /* TRUE if there is no more data */ 461 462 /* information about DSC line */ 463 char *line; /* pointer to last read DSC line */ 464 /* not null terminated */ 465 unsigned int line_length; /* number of characters in line */ 466 GSBOOL eol; /* TRUE if dsc_line contains EOL */ 467 GSBOOL last_cr; /* TRUE if last line ended in \r */ 468 /* check next time for \n */ 469 unsigned int line_count; /* line number */ 470 GSBOOL long_line; /* TRUE if found a line longer than 255 characters */ 471 char last_line[256]; /* previous DSC line, used for %%+ */ 472 473 /* more efficient string storage (for short strings) than malloc */ 474 CDSCSTRING *string_head; /* linked list head */ 475 CDSCSTRING *string; /* current list item */ 476 477 /* memory allocation routines */ 478 void *(*memalloc)(size_t size, void *closure_data); 479 void (*memfree)(void *ptr, void *closure_data); 480 void *mem_closure_data; 481 482 /* function for printing debug messages */ 483 void (*debug_print_fn)(void *caller_data, const char *str); 484 485 /* function for reporting errors in DSC comments */ 486 int (*dsc_error_fn)(void *caller_data, CDSC *dsc, 487 unsigned int explanation, const char *line, unsigned int line_len); 488 489 /* public data */ 490 /* Added 2001-10-01 */ 491 CDSCFBBOX *hires_bbox; /* the hires document bounding box */ 492 CDSCFBBOX *crop_box; /* the size of the trimmed page */ 493 CDCS2 *dcs2; /* Desktop Color Separations 2.0 */ 494 CDSCCOLOUR *colours; /* Process and custom colours */ 495 496 /* private data */ 497 /* Added 2002-03-30 */ 498 int ref_count; 499 500 /* public data */ 501 /* Added 2003-07-15 */ 502 CDSCMACBIN *macbin; /* Mac Binary header */ 503 }; 504 505 506 /* Public functions */ 507 508 /* Create and initialise DSC parser */ 509 CDSC *dsc_init(void *caller_data); 510 511 CDSC *dsc_init_with_alloc( 512 void *caller_data, 513 void *(*memalloc)(size_t size, void *closure_data), 514 void (*memfree)(void *ptr, void *closure_data), 515 void *closure_data); 516 517 /* Free the DSC parser */ 518 void dsc_free(CDSC *dsc); 519 520 /* Reference counting for dsc structure */ 521 /* dsc_new is the same as dsc_init */ 522 /* dsc_ref is called by dsc_new */ 523 /* If dsc_unref decrements to 0, dsc_free will be called */ 524 CDSC *dsc_new(void *caller_data); 525 int dsc_ref(CDSC *dsc); 526 int dsc_unref(CDSC *dsc); 527 528 /* Tell DSC parser how long document will be, to allow ignoring 529 * of early %%Trailer and %%EOF. This is optional. 530 */ 531 void dsc_set_length(CDSC *dsc, DSC_OFFSET len); 532 533 /* Process a buffer containing DSC comments and PostScript */ 534 int dsc_scan_data(CDSC *dsc, const char *data, int len); 535 536 /* All data has been processed, fixup any DSC errors */ 537 int dsc_fixup(CDSC *dsc); 538 539 /* Install error query function */ 540 void dsc_set_error_function(CDSC *dsc, 541 int (*dsc_error_fn)(void *caller_data, CDSC *dsc, 542 unsigned int explanation, const char *line, unsigned int line_len)); 543 544 /* Install print function for debug messages */ 545 void dsc_set_debug_function(CDSC *dsc, 546 void (*debug_fn)(void *caller_data, const char *str)); 547 548 /* Print a message to debug output, if provided */ 549 void dsc_debug_print(CDSC *dsc, const char *str); 550 551 /* Given a page number, find the filename for multi-file DCS 2.0 */ 552 const char * dsc_find_platefile(CDSC *dsc, int page); 553 554 /* Compare two strings, case insensitive */ 555 int dsc_stricmp(const char *s, const char *t); 556 557 /* should be internal only functions, but made available to 558 * GSview for handling PDF 559 */ 560 int dsc_add_page(CDSC *dsc, int ordinal, char *label); 561 int dsc_add_media(CDSC *dsc, CDSCMEDIA *media); 562 int dsc_set_page_bbox(CDSC *dsc, unsigned int page_number, 563 int llx, int lly, int urx, int ury); 564 565 /* in dscutil.c */ 566 void dsc_display(CDSC *dsc, void (*dfn)(void *ptr, const char *str)); 567 #endif /* dscparse_INCLUDED */ 568