📄 dscparse.c
字号:
unsigned int i;
char buf[32];
DSC_OFFSET *last;
if (dsc->id == CDSC_NOTDSC)
return 0;
/* flush last partial line */
dsc_scan_data(dsc, NULL, 0);
/* Fix DSC error: EOF before end of %%BeginData */
if (dsc->eof &&
(dsc->skip_lines || dsc->skip_bytes || dsc->skip_document)) {
switch (dsc->scan_section) {
case scan_comments:
dsc->endcomments = DSC_END(dsc);
break;
case scan_preview:
dsc->endpreview = DSC_END(dsc);
break;
case scan_defaults:
dsc->enddefaults = DSC_END(dsc);
break;
case scan_prolog:
dsc->endprolog = DSC_END(dsc);
break;
case scan_setup:
dsc->endsetup = DSC_END(dsc);
break;
case scan_pages:
if (dsc->page_count)
dsc->page[dsc->page_count-1].end = DSC_END(dsc);
break;
case scan_trailer:
case scan_eof:
dsc->endtrailer = DSC_END(dsc);
break;
}
}
/* Fix DSC error: code between %%EndSetup and %%Page */
if (dsc->page_count && (dsc->page[0].begin != dsc->endsetup)
&& (dsc->endsetup != dsc->beginsetup)) {
dsc->endsetup = dsc->page[0].begin;
dsc_debug_print(dsc, "Warning: code included between setup and first page\n");
}
/* Last page contained a false trailer, */
/* so extend last page to start of trailer */
if (dsc->page_count && (dsc->begintrailer != 0) &&
(dsc->page[dsc->page_count-1].end != dsc->begintrailer)) {
dsc_debug_print(dsc, "Ignoring earlier misplaced trailer\n");
dsc_debug_print(dsc, "and extending last page to start of trailer\n");
dsc->page[dsc->page_count-1].end = dsc->begintrailer;
}
/*
* Join up all sections.
* There might be extra code between them, or we might have
* missed including the \n which followed \r.
*/
last = &dsc->endcomments;
dsc_section_join(dsc->beginpreview, &dsc->endpreview, &last);
dsc_section_join(dsc->begindefaults, &dsc->enddefaults, &last);
dsc_section_join(dsc->beginprolog, &dsc->endprolog, &last);
dsc_section_join(dsc->beginsetup, &dsc->endsetup, &last);
for (i=0; i<dsc->page_count; i++)
dsc_section_join(dsc->page[i].begin, &dsc->page[i].end, &last);
if (dsc->begintrailer)
*last = dsc->begintrailer;
if ((dsc->page_pages == 0) && (dsc->page_count == 1)) {
/* don't flag an error if %%Pages absent but one %%Page found */
/* adjust incorrect page count */
dsc->page_pages = dsc->page_count;
}
/* Warnings and Errors that we can now identify */
if ((dsc->page_count != dsc->page_pages)) {
int rc = dsc_error(dsc, CDSC_MESSAGE_PAGES_WRONG, NULL, 0);
switch (rc) {
case CDSC_RESPONSE_OK:
/* adjust incorrect page count */
dsc->page_pages = dsc->page_count;
break;
case CDSC_RESPONSE_CANCEL:
break;;
case CDSC_RESPONSE_IGNORE_ALL:
return CDSC_NOTDSC;
}
}
if (dsc->epsf && (dsc->bbox == (CDSCBBOX *)NULL)) {
/* EPS files MUST include a BoundingBox */
int rc = dsc_error(dsc, CDSC_MESSAGE_EPS_NO_BBOX, NULL, 0);
switch (rc) {
case CDSC_RESPONSE_OK:
/* Assume that it is EPS */
break;
case CDSC_RESPONSE_CANCEL:
/* Is NOT an EPS file */
dsc->epsf = FALSE;
case CDSC_RESPONSE_IGNORE_ALL:
return CDSC_NOTDSC;
}
}
if (dsc->epsf && ((dsc->page_count > 1) || (dsc->page_pages > 1))) {
int rc = dsc_error(dsc, CDSC_MESSAGE_EPS_PAGES, NULL, 0);
switch (rc) {
case CDSC_RESPONSE_OK:
/* Is an EPS file */
break;
case CDSC_RESPONSE_CANCEL:
/* Is NOT an EPS file */
dsc->epsf = FALSE;
break;
case CDSC_RESPONSE_IGNORE_ALL:
return CDSC_NOTDSC;
}
}
/* convert single file DSC 2.0 into multiple pages */
dsc_dcs2_fixup(dsc);
if ((dsc->media_count == 1) && (dsc->page_media == NULL)) {
/* if one only media was specified, and default page media */
/* was not specified, assume that default is the only media. */
dsc->page_media = dsc->media[0];
}
if ((dsc->media_count != 0) && (dsc->page_media == NULL)) {
int rc = dsc_error(dsc, CDSC_MESSAGE_NO_MEDIA, NULL, 0);
switch (rc) {
case CDSC_RESPONSE_OK:
/* default media is first listed */
dsc->page_media = dsc->media[0];
break;
case CDSC_RESPONSE_CANCEL:
/* No default media */
break;
case CDSC_RESPONSE_IGNORE_ALL:
return CDSC_NOTDSC;
}
}
/* make sure all pages have a label */
for (i=0; i<dsc->page_count; i++) {
if (strlen(dsc->page[i].label) == 0) {
sprintf(buf, "%d", i+1);
if ((dsc->page[i].label = dsc_alloc_string(dsc, buf, (int)strlen(buf)))
== (char *)NULL)
return CDSC_ERROR; /* no memory */
}
}
return CDSC_OK;
}
/* Install a function to be used for displaying messages about
* DSC errors and warnings, and to request advice from user.
* Installing an error function is optional.
*/
void
dsc_set_error_function(CDSC *dsc,
int (*fn)(void *caller_data, CDSC *dsc,
unsigned int explanation, const char *line, unsigned int line_len))
{
dsc->dsc_error_fn = fn;
}
/* Install a function for printing debug messages */
/* This is optional */
void
dsc_set_debug_function(CDSC *dsc,
void (*debug_fn)(void *caller_data, const char *str))
{
dsc->debug_print_fn = debug_fn;
}
/* Doesn't need to be public for PostScript documents */
/* Made public so GSview can add pages when processing PDF files */
int
dsc_add_page(CDSC *dsc, int ordinal, char *label)
{
dsc->page[dsc->page_count].ordinal = ordinal;
dsc->page[dsc->page_count].label =
dsc_alloc_string(dsc, label, (int)strlen(label)+1);
dsc->page[dsc->page_count].begin = 0;
dsc->page[dsc->page_count].end = 0;
dsc->page[dsc->page_count].orientation = CDSC_ORIENT_UNKNOWN;
dsc->page[dsc->page_count].media = NULL;
dsc->page[dsc->page_count].bbox = NULL;
dsc->page[dsc->page_count].viewing_orientation = NULL;
dsc->page[dsc->page_count].crop_box = NULL;
dsc->page_count++;
if (dsc->page_count >= dsc->page_chunk_length) {
CDSCPAGE *new_page = (CDSCPAGE *)dsc_memalloc(dsc,
(CDSC_PAGE_CHUNK+dsc->page_count) * sizeof(CDSCPAGE));
if (new_page == NULL)
return CDSC_ERROR; /* out of memory */
memcpy(new_page, dsc->page,
dsc->page_count * sizeof(CDSCPAGE));
dsc_memfree(dsc, dsc->page);
dsc->page= new_page;
dsc->page_chunk_length = CDSC_PAGE_CHUNK+dsc->page_count;
}
return CDSC_OK;
}
/* Doesn't need to be public for PostScript documents */
/* Made public so GSview can store PDF MediaBox */
int
dsc_add_media(CDSC *dsc, CDSCMEDIA *media)
{
CDSCMEDIA **newmedia_array;
CDSCMEDIA *newmedia;
/* extend media array */
newmedia_array = (CDSCMEDIA **)dsc_memalloc(dsc,
(dsc->media_count + 1) * sizeof(CDSCMEDIA *));
if (newmedia_array == NULL)
return CDSC_ERROR; /* out of memory */
if (dsc->media != NULL) {
memcpy(newmedia_array, dsc->media,
dsc->media_count * sizeof(CDSCMEDIA *));
dsc_memfree(dsc, dsc->media);
}
dsc->media = newmedia_array;
/* allocate new media */
newmedia = dsc->media[dsc->media_count] =
(CDSCMEDIA *)dsc_memalloc(dsc, sizeof(CDSCMEDIA));
if (newmedia == NULL)
return CDSC_ERROR; /* out of memory */
newmedia->name = NULL;
newmedia->width = 595.0;
newmedia->height = 842.0;
newmedia->weight = 80.0;
newmedia->colour = NULL;
newmedia->type = NULL;
newmedia->mediabox = NULL;
dsc->media_count++;
if (media->name) {
newmedia->name = dsc_alloc_string(dsc, media->name,
(int)strlen(media->name));
if (newmedia->name == NULL)
return CDSC_ERROR; /* no memory */
}
newmedia->width = media->width;
newmedia->height = media->height;
newmedia->weight = media->weight;
if (media->colour) {
newmedia->colour = dsc_alloc_string(dsc, media->colour,
(int)strlen(media->colour));
if (newmedia->colour == NULL)
return CDSC_ERROR; /* no memory */
}
if (media->type) {
newmedia->type = dsc_alloc_string(dsc, media->type,
(int)strlen(media->type));
if (newmedia->type == NULL)
return CDSC_ERROR; /* no memory */
}
newmedia->mediabox = NULL;
if (media->mediabox) {
newmedia->mediabox = (CDSCBBOX *)dsc_memalloc(dsc, sizeof(CDSCBBOX));
if (newmedia->mediabox == NULL)
return CDSC_ERROR; /* no memory */
*newmedia->mediabox = *media->mediabox;
}
return CDSC_OK;
}
/* Doesn't need to be public for PostScript documents */
/* Made public so GSview can store PDF CropBox */
int
dsc_set_page_bbox(CDSC *dsc, unsigned int page_number,
int llx, int lly, int urx, int ury)
{
CDSCBBOX *bbox;
if (page_number >= dsc->page_count)
return CDSC_ERROR;
bbox = dsc->page[page_number].bbox;
if (bbox == NULL)
dsc->page[page_number].bbox = bbox =
(CDSCBBOX *)dsc_memalloc(dsc, sizeof(CDSCBBOX));
if (bbox == NULL)
return CDSC_ERROR;
bbox->llx = llx;
bbox->lly = lly;
bbox->urx = urx;
bbox->ury = ury;
return CDSC_OK;
}
/******************************************************************/
/* Private functions below here. */
/******************************************************************/
dsc_private void *
dsc_memalloc(CDSC *dsc, size_t size)
{
if (dsc->memalloc)
return dsc->memalloc(size, dsc->mem_closure_data);
return malloc(size);
}
dsc_private void
dsc_memfree(CDSC*dsc, void *ptr)
{
if (dsc->memfree)
dsc->memfree(ptr, dsc->mem_closure_data);
else
free(ptr);
}
/* private constructor */
dsc_private CDSC *
dsc_init2(CDSC *dsc)
{
dsc_reset(dsc);
dsc->string_head = (CDSCSTRING *)dsc_memalloc(dsc, sizeof(CDSCSTRING));
if (dsc->string_head == NULL) {
dsc_free(dsc);
return NULL; /* no memory */
}
dsc->string = dsc->string_head;
dsc->string->next = NULL;
dsc->string->data = (char *)dsc_memalloc(dsc, CDSC_STRING_CHUNK);
if (dsc->string->data == NULL) {
dsc_free(dsc);
return NULL; /* no memory */
}
dsc->string->index = 0;
dsc->string->length = CDSC_STRING_CHUNK;
dsc->page = (CDSCPAGE *)dsc_memalloc(dsc, CDSC_PAGE_CHUNK * sizeof(CDSCPAGE));
if (dsc->page == NULL) {
dsc_free(dsc);
return NULL; /* no memory */
}
dsc->page_chunk_length = CDSC_PAGE_CHUNK;
dsc->page_count = 0;
dsc->line = NULL;
dsc->data_length = 0;
dsc->data_index = dsc->data_length;
return dsc;
}
dsc_private void
dsc_reset(CDSC *dsc)
{
unsigned int i;
/* Clear public members */
dsc->dsc = FALSE;
dsc->ctrld = FALSE;
dsc->pjl = FALSE;
dsc->epsf = FALSE;
dsc->pdf = FALSE;
dsc->epsf = FALSE;
dsc->preview = CDSC_NOPREVIEW;
dsc->dsc_version = NULL; /* stored in dsc->string */
dsc->language_level = 0;
dsc->document_data = CDSC_DATA_UNKNOWN;
dsc->begincomments = 0;
dsc->endcomments = 0;
dsc->beginpreview = 0;
dsc->endpreview = 0;
dsc->begindefaults = 0;
dsc->enddefaults = 0;
dsc->beginprolog = 0;
dsc->endprolog = 0;
dsc->beginsetup = 0;
dsc->endsetup = 0;
dsc->begintrailer = 0;
dsc->endtrailer = 0;
for (i=0; i<dsc->page_count; i++) {
/* page media is pointer to an element of media or dsc_known_media */
/* do not free it. */
if (dsc->page[i].bbox)
dsc_memfree(dsc, dsc->page[i].bbox);
if (dsc->page[i].viewing_orientation)
dsc_memfree(dsc, dsc->page[i].viewing_orientation);
if (dsc->page[i].crop_box)
dsc_memfree(dsc, dsc->page[i].crop_box);
}
if (dsc->page)
dsc_memfree(dsc, dsc->page);
dsc->page = NULL;
dsc->page_count = 0;
dsc->page_pages = 0;
dsc->page_order = CDSC_ORDER_UNKNOWN;
dsc->page_orientation = CDSC_ORIENT_UNKNOWN;
if (dsc->viewing_orientation)
dsc_memfree(dsc, dsc->viewing_orientation);
dsc->viewing_orientation = NULL;
if (dsc->media) {
for (i=0; i<dsc->media_count; i++) {
if (dsc->media[i]) {
if (dsc->media[i]->mediabox)
dsc_memfree(dsc, dsc->media[i]->mediabox);
dsc_memfree(dsc, dsc->media[i]);
}
}
dsc_memfree(dsc, dsc->media);
}
dsc->media_count = 0;
dsc->media = NULL;
/* page_media is pointer to an element of media or dsc_known_media */
/* do not free it. */
dsc->page_media = NULL;
if (dsc->bbox)
dsc_memfree(dsc, dsc->bbox);
dsc->bbox = NULL;
if (dsc->page_bbox)
dsc_memfree(dsc, dsc->page_bbox);
dsc->page_bbox = NULL;
if (dsc->doseps)
dsc_memfree(dsc, dsc->doseps);
dsc->doseps = NULL;
dsc->dsc_title = NULL;
dsc->dsc_creator = NULL;
dsc->dsc_date = NULL;
dsc->dsc_for = NULL;
dsc->max_error = DSC_MAX_ERROR;
dsc->severity = dsc_severity;
/* Clear private members */
/* Don't touch dsc->caller_data */
dsc->id = CDSC_OK;
dsc->scan_section = scan_none;
dsc->doseps_end = 0;
dsc->page_chunk_length = 0;
dsc->file_length = 0;
dsc->skip_document = 0;
dsc->skip_bytes = 0;
dsc->skip_lines = 0;
dsc->skip_pjl = 0;
dsc->begin_font_count = 0;
dsc->begin_feature_count = 0;
dsc->begin_resource_count = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -