[gs-cvs] rev 8653 - trunk/gs/src
alexcher at ghostscript.com
alexcher at ghostscript.com
Sun Apr 20 16:40:49 PDT 2008
Author: alexcher
Date: 2008-04-20 16:40:49 -0700 (Sun, 20 Apr 2008)
New Revision: 8653
Modified:
trunk/gs/src/zdscpars.c
Log:
Ignore DSC comments in nested EPS files and data blocks. Thanks to
William Bader for the patch. Bug 689791.
RIFFERENCES:
None
Modified: trunk/gs/src/zdscpars.c
===================================================================
--- trunk/gs/src/zdscpars.c 2008-04-20 04:51:21 UTC (rev 8652)
+++ trunk/gs/src/zdscpars.c 2008-04-20 23:40:49 UTC (rev 8653)
@@ -97,6 +97,7 @@
*/
typedef struct dsc_data_s {
CDSC *dsc_data_ptr;
+ int document_level;
} dsc_data_t;
/* Structure descriptors */
@@ -132,9 +133,11 @@
dict * const pdict = op->value.pdict;
gs_memory_t * const mem = (gs_memory_t *)dict_memory(pdict);
dsc_data_t * const data =
- gs_alloc_struct(mem, dsc_data_t, &st_dsc_data_t,
- "DSC parser init");
+ gs_alloc_struct(mem, dsc_data_t, &st_dsc_data_t, "DSC parser init");
+ if (!data)
+ return_error(e_VMerror);
+ data->document_level = 0;
data->dsc_data_ptr = dsc_init((void *) "Ghostscript DSC parsing");
if (!data->dsc_data_ptr)
return_error(e_VMerror);
@@ -402,7 +405,7 @@
const cmdlist_t *pCmdList = DSCcmdlist;
const char * const *pBadList = BadCmdlist;
ref * pvalue;
- CDSC * dsc_data = NULL;
+ dsc_data_t * dsc_state = NULL;
dict_param_list list;
/*
@@ -417,6 +420,13 @@
if (ssize > MAX_DSC_MSG_SIZE) /* need room for EOL + \0 */
ssize = MAX_DSC_MSG_SIZE;
/*
+ * Retrieve our state.
+ */
+ code = dict_find_string(opDict, dsc_dict_name, &pvalue);
+ if (code < 0)
+ return code;
+ dsc_state = r_ptr(pvalue, dsc_data_t);
+ /*
* Pick up the comment string to be parsed.
*/
memcpy(dsc_buffer, opString->value.bytes, ssize);
@@ -428,19 +438,22 @@
while (*pBadList && strncmp(*pBadList, dsc_buffer, strlen(*pBadList)))
pBadList++;
if (*pBadList) { /* If found in list, then skip comment */
- comment_code = 0; /* Force NOP */
+ comment_code = 0; /* Ignore */
+ if (dsc_buffer[2] == 'B') {
+ dsc_state->document_level++;
+ } else if (dsc_state->document_level > 0) {
+ dsc_state->document_level--;
+ }
}
- else {
+ else if (dsc_state->document_level > 0) {
+ comment_code = 0; /* Ignore */
+ } else {
/*
* Parse comments - use Russell Lang's DSC parser. We need to get
* data area for Russell Lang's parser. Note: We have saved the
* location of the data area for the parser in our DSC dict.
*/
- code = dict_find_string(opDict, dsc_dict_name, &pvalue);
- dsc_data = r_ptr(pvalue, dsc_data_t)->dsc_data_ptr;
- if (code < 0)
- return code;
- comment_code = dsc_scan_data(dsc_data, dsc_buffer, ssize + 1);
+ comment_code = dsc_scan_data(dsc_state->dsc_data_ptr, dsc_buffer, ssize + 1);
if_debug1('%', "[%%].parse_dsc_comments: code = %d\n", comment_code);
/*
* We ignore any errors from Russell's parser. The only value that
@@ -461,7 +474,7 @@
code = dict_param_list_write(&list, opDict, NULL, iimemory);
if (code < 0)
return code;
- code = (pCmdList->dsc_proc)((gs_param_list *)&list, dsc_data);
+ code = (pCmdList->dsc_proc)((gs_param_list *)&list, dsc_state->dsc_data_ptr);
iparam_list_release(&list);
if (code < 0)
return code;
More information about the gs-cvs
mailing list