[gs-cvs] rev 7837 - trunk/gs/src

leonardo at ghostscript.com leonardo at ghostscript.com
Mon Apr 9 01:54:32 PDT 2007


Author: leonardo
Date: 2007-04-09 01:54:30 -0700 (Mon, 09 Apr 2007)
New Revision: 7837

Modified:
   trunk/gs/src/gdevprn.c
   trunk/gs/src/gdevprna.c
   trunk/gs/src/gxband.h
   trunk/gs/src/gxclfile.c
   trunk/gs/src/gxclio.h
   trunk/gs/src/gxclist.c
   trunk/gs/src/gxclist.h
   trunk/gs/src/gxclmem.c
   trunk/gs/src/gxclmem.h
   trunk/gs/src/gxclpage.c
   trunk/gs/src/gxclread.c
   trunk/gs/src/gxclutil.c
   trunk/gs/src/gxpageq.c
   trunk/gs/src/gxpageq.h
   trunk/gs/src/lib.mak
Log:
Implementing clist i/o virtual functions.

DETAILS : 

This is a preparation for fixing the bug 688396.
This change is algorithmically equivalent.

The old code defines macros for substituting
memfile_* procs to clist_* procs when 
the makefile option BAND_LIST_STORAGE is set to 'memory'.
Instead that, the new code defines a new structure clist_io_procs_t,
stores the procs into it, and chooses 
an implementation by the module initialization mechanizm.
The new function clist_init_io_procs works for that.

We would like to define the procs as virtual methods
of *clist_file_ptr, but it needs to change the logics
of clist_fopen, clist_fclose with allocating an
auxiliary structure. We would like to make this improvement 
as a separate patch in order to simplify the
regression testing and debugging.

EXPECTED DIFFERENCES :

None.


Modified: trunk/gs/src/gdevprn.c
===================================================================
--- trunk/gs/src/gdevprn.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gdevprn.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -137,6 +137,7 @@
 open_c:
     ppdev->buf = base;
     ppdev->buffer_space = space;
+    clist_init_io_procs(pclist_dev, false);
     clist_init_params(pclist_dev, base, space, pdev,
 		      ppdev->printer_procs.buf_procs,
 		      space_params->band, ppdev->is_async_renderer,

Modified: trunk/gs/src/gdevprna.c
===================================================================
--- trunk/gs/src/gdevprna.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gdevprna.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -251,9 +251,11 @@
 gdev_prn_async_write_close_device(gx_device * pdev)
 {
     gx_device_printer *const pwdev = (gx_device_printer *) pdev;
+    gx_device_clist_writer *const pcwdev =
+	&((gx_device_clist *) pdev)->writer;
 
     /* Signal render thread to close & terminate when done */
-    gx_page_queue_add_page(pwdev->page_queue,
+    gx_page_queue_add_page(pcwdev, pwdev->page_queue,
 			   GX_PAGE_QUEUE_ACTION_TERMINATE, 0, 0);
 
     /* Wait for renderer to finish all pages & terminate req */
@@ -599,7 +601,7 @@
 
     /* do NOT close files before sending to page queue */
     flush_code = clist_end_page(pcwdev);
-    add_code = gx_page_queue_add_page(pwdev->page_queue,
+    add_code = gx_page_queue_add_page(pcwdev, pwdev->page_queue,
 				(flush ? GX_PAGE_QUEUE_ACTION_FULL_PAGE :
 				 GX_PAGE_QUEUE_ACTION_COPY_PAGE),
 				      &pcwdev->page_info, num_copies);
@@ -654,7 +656,7 @@
 
     /* do NOT close files before sending to page queue */
     flush_code = clist_end_page(pcwdev);
-    add_code = gx_page_queue_add_page(pwdev->page_queue,
+    add_code = gx_page_queue_add_page(pcwdev, pwdev->page_queue,
 				(partial ? GX_PAGE_QUEUE_ACTION_PARTIAL_PAGE :
 				 GX_PAGE_QUEUE_ACTION_FULL_PAGE),
 				      &pcwdev->page_info, 0);

Modified: trunk/gs/src/gxband.h
===================================================================
--- trunk/gs/src/gxband.h	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxband.h	2007-04-09 08:54:30 UTC (rev 7837)
@@ -61,6 +61,7 @@
     clist_file_ptr cfile;	/* command file, normally 0 */
     char bfname[gp_file_name_sizeof];	/* block file name */
     clist_file_ptr bfile;	/* block file, normally 0 */
+    clist_io_procs_t *io_procs;
     uint tile_cache_size;	/* size of tile cache */
     int64_t bfile_end_pos;		/* ftell at end of bfile */
     gx_band_params_t band_params;  /* parameters used when writing band list */
@@ -70,7 +71,7 @@
     gx_colors_used_t band_colors_used[PAGE_INFO_NUM_COLORS_USED];  /* colors used on the page */
 } gx_band_page_info_t;
 #define PAGE_INFO_NULL_VALUES\
-  { 0 }, 0, { 0 }, 0, 0, 0, { BAND_PARAMS_INITIAL_VALUES },\
+  { 0 }, 0, { 0 }, NULL, 0, 0, 0, { BAND_PARAMS_INITIAL_VALUES },\
   0x3fffffff, { { 0 } }
 
 /*

Modified: trunk/gs/src/gxclfile.c
===================================================================
--- trunk/gs/src/gxclfile.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclfile.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -25,9 +25,11 @@
 /* This is an implementation of the command list I/O interface */
 /* that uses the file system for storage. */
 
+extern clist_io_procs_t *clist_io_procs_file_global;
+
 /* ------ Open/close/unlink ------ */
 
-int
+private int
 clist_fopen(char fname[gp_file_name_sizeof], const char *fmode,
 	    clist_file_ptr * pcf, gs_memory_t * mem, gs_memory_t *data_mem,
 	    bool ok_to_compress)
@@ -47,7 +49,13 @@
     return 0;
 }
 
-int
+private int
+clist_unlink(const char *fname)
+{
+    return (unlink(fname) != 0 ? gs_note_error(gs_error_ioerror) : 0);
+}
+
+private int
 clist_fclose(clist_file_ptr cf, const char *fname, bool delete)
 {
     return (fclose((FILE *) cf) != 0 ? gs_note_error(gs_error_ioerror) :
@@ -55,21 +63,9 @@
 	    0);
 }
 
-int
-clist_unlink(const char *fname)
-{
-    return (unlink(fname) != 0 ? gs_note_error(gs_error_ioerror) : 0);
-}
-
 /* ------ Writing ------ */
 
-long
-clist_space_available(long requested)
-{
-    return requested;
-}
-
-int
+private int
 clist_fwrite_chars(const void *data, uint len, clist_file_ptr cf)
 {
     return fwrite(data, 1, len, (FILE *) cf);
@@ -77,7 +73,7 @@
 
 /* ------ Reading ------ */
 
-int
+private int
 clist_fread_chars(void *data, uint len, clist_file_ptr cf)
 {
     FILE *f = (FILE *) cf;
@@ -111,25 +107,25 @@
 
 /* ------ Position/status ------ */
 
-int
+private int
 clist_set_memory_warning(clist_file_ptr cf, int bytes_left)
 {
     return 0;			/* no-op */
 }
 
-int
+private int
 clist_ferror_code(clist_file_ptr cf)
 {
     return (ferror((FILE *) cf) ? gs_error_ioerror : 0);
 }
 
-int64_t
+private int64_t
 clist_ftell(clist_file_ptr cf)
 {
     return gp_ftell_64((FILE *) cf);
 }
 
-void
+private void
 clist_rewind(clist_file_ptr cf, bool discard_data, const char *fname)
 {
     FILE *f = (FILE *) cf;
@@ -153,8 +149,29 @@
     }
 }
 
-int
+private int
 clist_fseek(clist_file_ptr cf, int64_t offset, int mode, const char *ignore_fname)
 {
     return gp_fseek_64((FILE *) cf, offset, mode);
 }
+
+clist_io_procs_t clist_io_procs_file = {
+    clist_fopen,
+    clist_fclose,
+    clist_unlink,
+    clist_fwrite_chars,
+    clist_fread_chars,
+    clist_set_memory_warning,
+    clist_ferror_code,
+    clist_ftell,
+    clist_rewind,
+    clist_fseek,
+};
+
+init_proc(gs_clist_init);
+int
+gs_gxclfile_init(gs_memory_t *mem)
+{
+    clist_io_procs_file_global = &clist_io_procs_file;
+    return 0;
+}

Modified: trunk/gs/src/gxclio.h
===================================================================
--- trunk/gs/src/gxclio.h	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclio.h	2007-04-09 08:54:30 UTC (rev 7837)
@@ -29,63 +29,67 @@
 
 typedef void *clist_file_ptr;	/* We can't do any better than this. */
 
-/* ---------------- Open/close/unlink ---------------- */
+struct clist_io_procs_s {
 
-/*
- * If *fname = 0, generate and store a new scratch file name; otherwise,
- * open an existing file.  Only modes "r" and "w+" are supported,
- * and only binary data (but the caller must append the "b" if needed).
- * Mode "r" with *fname = 0 is an error.
- */
-int clist_fopen(char fname[gp_file_name_sizeof], const char *fmode,
-		clist_file_ptr * pcf,
-		gs_memory_t * mem, gs_memory_t *data_mem,
-		bool ok_to_compress);
+    /* ---------------- Open/close/unlink ---------------- */
 
-/*
- * Close a file, optionally deleting it.
- */
-int clist_fclose(clist_file_ptr cf, const char *fname, bool delete);
+    /*
+     * If *fname = 0, generate and store a new scratch file name; otherwise,
+     * open an existing file.  Only modes "r" and "w+" are supported,
+     * and only binary data (but the caller must append the "b" if needed).
+     * Mode "r" with *fname = 0 is an error.
+     */
+    int (*fopen)(char fname[gp_file_name_sizeof], const char *fmode,
+		    clist_file_ptr * pcf,
+		    gs_memory_t * mem, gs_memory_t *data_mem,
+		    bool ok_to_compress);
 
-/*
- * Delete a file.
- */
-int clist_unlink(const char *fname);
+    /*
+     * Close a file, optionally deleting it.
+     */
+    int (*fclose)(clist_file_ptr cf, const char *fname, bool delete);
 
-/* ---------------- Writing ---------------- */
+    /*
+     * Delete a file.
+     */
+    int (*unlink)(const char *fname);
 
-/* clist_space_available returns min(requested, available). */
-long clist_space_available(long requested);
+    /* ---------------- Writing ---------------- */
 
-int clist_fwrite_chars(const void *data, uint len, clist_file_ptr cf);
+    int (*fwrite_chars)(const void *data, uint len, clist_file_ptr cf);
 
-/* ---------------- Reading ---------------- */
+    /* ---------------- Reading ---------------- */
 
-int clist_fread_chars(void *data, uint len, clist_file_ptr cf);
+    int (*fread_chars)(void *data, uint len, clist_file_ptr cf);
 
-/* ---------------- Position/status ---------------- */
+    /* ---------------- Position/status ---------------- */
 
-/*
- * Set the low-memory warning threshold.  clist_ferror_code will return 1
- * if fewer than this many bytes of memory are left for storing band data.
- */
-int clist_set_memory_warning(clist_file_ptr cf, int bytes_left);
+    /*
+     * Set the low-memory warning threshold.  clist_ferror_code will return 1
+     * if fewer than this many bytes of memory are left for storing band data.
+     */
+    int (*set_memory_warning)(clist_file_ptr cf, int bytes_left);
 
-/*
- * clist_ferror_code returns a negative error code per gserrors.h, not a
- * Boolean; 0 means no error, 1 means low-memory warning.
- */
-int clist_ferror_code(clist_file_ptr cf);
+    /*
+     * clist_ferror_code returns a negative error code per gserrors.h, not a
+     * Boolean; 0 means no error, 1 means low-memory warning.
+     */
+    int (*ferror_code)(clist_file_ptr cf);
 
-int64_t clist_ftell(clist_file_ptr cf);
+    int64_t (*ftell)(clist_file_ptr cf);
 
-/*
- * We pass the file name to clist_rewind and clist_fseek in case the
- * implementation has to close and reopen the file.  (clist_fseek with
- * offset = 0 and mode = SEEK_END indicates we are about to append.)
- */
-void clist_rewind(clist_file_ptr cf, bool discard_data, const char *fname);
+    /*
+     * We pass the file name to clist_rewind and clist_fseek in case the
+     * implementation has to close and reopen the file.  (clist_fseek with
+     * offset = 0 and mode = SEEK_END indicates we are about to append.)
+     */
+    void (*rewind)(clist_file_ptr cf, bool discard_data, const char *fname);
 
-int clist_fseek(clist_file_ptr cf, int64_t offset, int mode, const char *fname);
+    int (*fseek)(clist_file_ptr cf, int64_t offset, int mode, const char *fname);
+};
 
+typedef struct clist_io_procs_s clist_io_procs_t;
+
+extern clist_io_procs_t *clist_io_procs_file_global;
+
 #endif /* gxclio_INCLUDED */

Modified: trunk/gs/src/gxclist.c
===================================================================
--- trunk/gs/src/gxclist.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclist.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -139,6 +139,27 @@
     gx_forward_ret_devn_params
 };
 
+/*------------------- Choose the implementation -----------------------
+
+   For chossing the clist i/o implementation by makefile options
+   we define a global variable, which is initialized with
+   file io procs when they are included into the build.
+ */
+clist_io_procs_t *clist_io_procs_file_global = NULL;
+
+void 
+clist_init_io_procs(gx_device_clist *pclist_dev, bool in_memory)
+{   
+#if 0 /* reserved for future use */
+    if (in_memory || clist_io_procs_file_global == NULL)
+	pclist_dev->common.page_info.io_procs = pclist_dev->reader.page_info.io_procs = 
+		pclist_dev->writer.page_info.io_procs = &clist_io_procs_memory;
+    else
+#endif
+	pclist_dev->common.page_info.io_procs = pclist_dev->reader.page_info.io_procs = 
+		pclist_dev->writer.page_info.io_procs = clist_io_procs_file_global;
+}
+
 /* ------ Define the command set and syntax ------ */
 
 /* Initialization for imager state. */
@@ -452,9 +473,9 @@
     /* if partial page rendering is available */
     if ( clist_test_VMerror_recoverable(cdev) )
 	{ if (cdev->page_bfile != 0)
-	    code = clist_set_memory_warning(cdev->page_bfile, b_block);
+	    code = cdev->page_info.io_procs->set_memory_warning(cdev->page_bfile, b_block);
 	if (code >= 0 && cdev->page_cfile != 0)
-	    code = clist_set_memory_warning(cdev->page_cfile, c_block);
+	    code = cdev->page_info.io_procs->set_memory_warning(cdev->page_cfile, c_block);
 	}
     return code;
 }
@@ -512,10 +533,10 @@
     cdev->page_cfname[0] = 0;	/* create a new file */
     cdev->page_bfname[0] = 0;	/* ditto */
     clist_reset_page(cdev);
-    if ((code = clist_fopen(cdev->page_cfname, fmode, &cdev->page_cfile,
+    if ((code = cdev->page_info.io_procs->fopen(cdev->page_cfname, fmode, &cdev->page_cfile,
 			    cdev->bandlist_memory, cdev->bandlist_memory,
 			    true)) < 0 ||
-	(code = clist_fopen(cdev->page_bfname, fmode, &cdev->page_bfile,
+	(code = cdev->page_info.io_procs->fopen(cdev->page_bfname, fmode, &cdev->page_bfile,
 			    cdev->bandlist_memory, cdev->bandlist_memory,
 			    false)) < 0 ||
 	(code = clist_reinit_output_file(dev)) < 0
@@ -533,11 +554,11 @@
 clist_close_page_info(gx_band_page_info_t *ppi)
 {
     if (ppi->cfile != NULL) {
-	clist_fclose(ppi->cfile, ppi->cfname, true);
+	ppi->io_procs->fclose(ppi->cfile, ppi->cfname, true);
 	ppi->cfile = NULL;
     }
     if (ppi->bfile != NULL) {
-	clist_fclose(ppi->bfile, ppi->bfname, true);
+	ppi->io_procs->fclose(ppi->bfile, ppi->bfname, true);
 	ppi->bfile = NULL;
     }
     return 0;
@@ -601,15 +622,15 @@
 
     if (flush) {
 	if (cdev->page_cfile != 0)
-	    clist_rewind(cdev->page_cfile, true, cdev->page_cfname);
+	    cdev->page_info.io_procs->rewind(cdev->page_cfile, true, cdev->page_cfname);
 	if (cdev->page_bfile != 0)
-	    clist_rewind(cdev->page_bfile, true, cdev->page_bfname);
+	    cdev->page_info.io_procs->rewind(cdev->page_bfile, true, cdev->page_bfname);
 	clist_reset_page(cdev);
     } else {
 	if (cdev->page_cfile != 0)
-	    clist_fseek(cdev->page_cfile, 0L, SEEK_END, cdev->page_cfname);
+	    cdev->page_info.io_procs->fseek(cdev->page_cfile, 0L, SEEK_END, cdev->page_cfname);
 	if (cdev->page_bfile != 0)
-	    clist_fseek(cdev->page_bfile, 0L, SEEK_END, cdev->page_bfname);
+	    cdev->page_info.io_procs->fseek(cdev->page_bfile, 0L, SEEK_END, cdev->page_bfname);
     }
     code = clist_init(dev);		/* reinitialize */
     if (code >= 0)
@@ -636,24 +657,24 @@
 	 * Note that because of copypage, there may be many such entries.
 	 */
 	cb.band_min = cb.band_max = cmd_band_end;
-	cb.pos = (cldev->page_cfile == 0 ? 0 : clist_ftell(cldev->page_cfile));
-	code = clist_fwrite_chars(&cb, sizeof(cb), cldev->page_bfile);
+	cb.pos = (cldev->page_cfile == 0 ? 0 : cldev->page_info.io_procs->ftell(cldev->page_cfile));
+	code = cldev->page_info.io_procs->fwrite_chars(&cb, sizeof(cb), cldev->page_bfile);
 	if (code > 0)
 	    code = 0;
     }
     if (code >= 0) {
 	clist_compute_colors_used(cldev);
 	ecode |= code;
-	cldev->page_bfile_end_pos = clist_ftell(cldev->page_bfile);
+	cldev->page_bfile_end_pos = cldev->page_info.io_procs->ftell(cldev->page_bfile);
     }
     if (code < 0)
 	ecode = code;
 
     /* Reset warning margin to 0 to release reserve memory if mem files */
     if (cldev->page_bfile != 0)
-	clist_set_memory_warning(cldev->page_bfile, 0);
+	cldev->page_info.io_procs->set_memory_warning(cldev->page_bfile, 0);
     if (cldev->page_cfile != 0)
-	clist_set_memory_warning(cldev->page_cfile, 0);
+	cldev->page_info.io_procs->set_memory_warning(cldev->page_cfile, 0);
 
 #ifdef DEBUG
     if (gs_debug_c('l') | gs_debug_c(':'))

Modified: trunk/gs/src/gxclist.h
===================================================================
--- trunk/gs/src/gxclist.h	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclist.h	2007-04-09 08:54:30 UTC (rev 7837)
@@ -176,7 +176,7 @@
 	int ymin, ymax;			/* current band, <0 when writing */\
 		/* Following are set when writing, read when reading. */\
 	gx_band_page_info_t page_info;	/* page information */\
-	int nbands		/* # of bands */
+	int nbands			/* # of bands */
 
 typedef struct gx_device_clist_common_s {
     gx_device_clist_common_members;
@@ -300,6 +300,8 @@
 /* The device template itself is never used, only the procedures. */
 extern const gx_device_procs gs_clist_device_procs;
 
+void clist_init_io_procs(gx_device_clist *pclist_dev, bool in_memory);
+
 /* Reset (or prepare to append to) the command list after printing a page. */
 int clist_finish_page(gx_device * dev, bool flush);
 

Modified: trunk/gs/src/gxclmem.c
===================================================================
--- trunk/gs/src/gxclmem.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclmem.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -152,6 +152,8 @@
 	/* forward references */
 private void memfile_free_mem(MEMFILE * f);
 private int memfile_init_empty(MEMFILE * f);
+private int memfile_set_memory_warning(clist_file_ptr cf, int bytes_left);
+private int memfile_fclose(clist_file_ptr cf, const char *fname, bool delete);
 
 /************************************************/
 /*   #define DEBUG      /- force statistics -/  */
@@ -218,7 +220,7 @@
 
 /* ---------------- Open/close/unlink ---------------- */
 
-int
+private int
 memfile_fopen(char fname[gp_file_name_sizeof], const char *fmode,
 	      clist_file_ptr /*MEMFILE * */  * pf,
 	      gs_memory_t *mem, gs_memory_t *data_mem, bool ok_to_compress)
@@ -319,7 +321,7 @@
     return code;
 }
 
-int
+private int
 memfile_fclose(clist_file_ptr cf, const char *fname, bool delete)
 {
     MEMFILE *const f = (MEMFILE *)cf;
@@ -355,7 +357,7 @@
     return 0;
 }
 
-int
+private int
 memfile_unlink(const char *fname)
 {
     /*
@@ -368,7 +370,7 @@
 /* ---------------- Writing ---------------- */
 
 /* Pre-alloc enough reserve mem blox to guarantee a write of N bytes will succeed */
-int	/* returns 0 ok, gs_error_VMerror if insufficient */
+private int	/* returns 0 ok, gs_error_VMerror if insufficient */
 memfile_set_memory_warning(clist_file_ptr cf, int bytes_left)
 {
     MEMFILE *const f = (MEMFILE *)cf;
@@ -611,7 +613,7 @@
     return (ecode);
 }
 
-int	/* returns # of chars actually written */
+private int	/* returns # of chars actually written */
 memfile_fwrite_chars(const void *data, uint len, clist_file_ptr cf)
 {
     const char *str = (const char *)data;
@@ -824,7 +826,7 @@
 
 /* ---------------- Reading ---------------- */
 
-int
+private int
 memfile_fread_chars(void *data, uint len, clist_file_ptr cf)
 {
     char *str = (char *)data;
@@ -857,19 +859,19 @@
 
 /* ---------------- Position/status ---------------- */
 
-int
+private int
 memfile_ferror_code(clist_file_ptr cf)
 {
     return (((MEMFILE *) cf)->error_code);	/* errors stored here */
 }
 
-int64_t
+private int64_t
 memfile_ftell(clist_file_ptr cf)
 {
     return (((MEMFILE *) cf)->log_curr_pos);
 }
 
-void
+private void
 memfile_rewind(clist_file_ptr cf, bool discard_data, const char *ignore_fname)
 {
     MEMFILE *f = (MEMFILE *) cf;
@@ -885,7 +887,7 @@
     }
 }
 
-int
+private int
 memfile_fseek(clist_file_ptr cf, int64_t offset, int mode, const char *ignore_fname)
 {
     MEMFILE *f = (MEMFILE *) cf;
@@ -1122,3 +1124,23 @@
 
     return 0;
 }
+
+clist_io_procs_t clist_io_procs_memory = {
+    memfile_fopen,
+    memfile_fclose,
+    memfile_unlink,
+    memfile_fwrite_chars,
+    memfile_fread_chars,
+    memfile_set_memory_warning,
+    memfile_ferror_code,
+    memfile_ftell,
+    memfile_rewind,
+    memfile_fseek,
+};
+
+int
+gs_gxclmem_init(gs_memory_t *mem)
+{
+    clist_io_procs_file_global = &clist_io_procs_memory;
+    return 0;
+}

Modified: trunk/gs/src/gxclmem.h
===================================================================
--- trunk/gs/src/gxclmem.h	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclmem.h	2007-04-09 08:54:30 UTC (rev 7837)
@@ -113,29 +113,6 @@
   gs_private_st_ptrs2(st_MEMFILE, MEMFILE, "MEMFILE",\
     MEMFILE_enum_ptrs, MEMFILE_reloc_ptrs, compress_state, decompress_state)
 
-/* Make the memfile_... operations aliases for the clist_... operations. */
-
-#define memfile_fopen(fname, fmode, pcf, mem, data_mem, compress)\
-  clist_fopen(fname, fmode, pcf, mem, data_mem, compress)
-#define memfile_fclose(cf, fname, delete)\
-  clist_fclose(cf, fname, delete)
-#define memfile_unlink(fname)\
-  clist_unlink(fname)
-
-#define memfile_space_available(req)\
-  clist_space_available(req)
-#define memfile_fwrite_chars(data, len, cf)\
-  clist_fwrite_chars(data, len, cf)
-
-#define memfile_fread_chars(data, len, cf)\
-  clist_fread_chars(data, len, cf)
-
-#define memfile_set_memory_warning(cf, nbytes) clist_set_memory_warning(cf, nbytes)
-#define memfile_ferror_code(cf) clist_ferror_code(cf)
-#define memfile_ftell(cf) clist_ftell(cf)
-#define memfile_rewind(cf, discard, fname) clist_rewind(cf, discard, fname)
-#define memfile_fseek(cf, offset, mode, fname) clist_fseek(cf, offset, mode, fname)
-
 /* Declare the procedures for returning the prototype filter states */
 /* for compressing and decompressing the band list. */
 const stream_state *clist_compressor_state(void *);

Modified: trunk/gs/src/gxclpage.c
===================================================================
--- trunk/gs/src/gxclpage.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclpage.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -22,6 +22,8 @@
 gdev_prn_save_page(gx_device_printer * pdev, gx_saved_page * page,
 		   int num_copies)
 {
+    gx_device_clist *cdev = (gx_device_clist *) pdev;
+
     /* Make sure we are banding. */
     if (!pdev->buffer_space)
 	return_error(gs_error_rangecheck);
@@ -33,8 +35,8 @@
 	int code;
 
 	if ((code = clist_end_page(pcldev)) < 0 ||
-	    (code = clist_fclose(pcldev->page_cfile, pcldev->page_cfname, false)) < 0 ||
-	    (code = clist_fclose(pcldev->page_bfile, pcldev->page_bfname, false)) < 0
+	    (code = cdev->common.page_info.io_procs->fclose(pcldev->page_cfile, pcldev->page_cfname, false)) < 0 ||
+	    (code = cdev->common.page_info.io_procs->fclose(pcldev->page_bfile, pcldev->page_bfname, false)) < 0
 	    )
 	    return code;
 	/* Save the device information. */
@@ -108,8 +110,8 @@
 	for (i = 0; i < count; ++i) {
 	    const gx_saved_page *page = ppages[i].page;
 
-	    clist_unlink(page->info.cfname);
-	    clist_unlink(page->info.bfname);
+	    pcldev->page_info.io_procs->unlink(page->info.cfname);
+	    pcldev->page_info.io_procs->unlink(page->info.bfname);
 	}
 	return code;
     }

Modified: trunk/gs/src/gxclread.c
===================================================================
--- trunk/gs/src/gxclread.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclread.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -60,12 +60,13 @@
 s_band_read_init(stream_state * st)
 {
     stream_band_read_state *const ss = (stream_band_read_state *) st;
+    clist_io_procs_t *io_procs = ss->page_info.io_procs;
 
     ss->left = 0;
     ss->b_this.band_min = 0;
     ss->b_this.band_max = 0;
     ss->b_this.pos = 0;
-    clist_rewind(ss->page_bfile, false, ss->page_bfname);
+    io_procs->rewind(ss->page_bfile, false, ss->page_bfname);
     return 0;
 }
 
@@ -81,13 +82,14 @@
     uint left = ss->left;
     int status = 1;
     uint count;
+    clist_io_procs_t *io_procs = ss->page_info.io_procs;
 
     while ((count = wlimit - q) != 0) {
 	if (left) {		/* Read more data for the current run. */
 	    if (count > left)
 		count = left;
-	    clist_fread_chars(q + 1, count, cfile);
-	    if (clist_ferror_code(cfile) < 0) {
+	    io_procs->fread_chars(q + 1, count, cfile);
+	    if (io_procs->ferror_code(cfile) < 0) {
 		status = ERRC;
 		break;
 	    }
@@ -102,7 +104,7 @@
 	 * that includes a current band).
 	 */
 	if (ss->b_this.band_min == cmd_band_end &&
-	    clist_ftell(bfile) == ss->page_bfile_end_pos
+	    io_procs->ftell(bfile) == ss->page_bfile_end_pos
 	    ) {
 	    status = EOFC;
 	    break;
@@ -111,15 +113,15 @@
 	    int bmax = ss->b_this.band_max;
 	    int64_t pos = ss->b_this.pos;
 
-	    clist_fread_chars(&ss->b_this, sizeof(ss->b_this), bfile);
+	    io_procs->fread_chars(&ss->b_this, sizeof(ss->b_this), bfile);
 	    if (!(ss->band_last >= bmin && ss->band_first <= bmax))
 		goto rb;
-	    clist_fseek(cfile, pos, SEEK_SET, ss->page_cfname);
+	    io_procs->fseek(cfile, pos, SEEK_SET, ss->page_cfname);
 	    left = (uint) (ss->b_this.pos - pos);
 	    if_debug7('l', 
 		      "[l]reading for bands (%d,%d) at bfile %ld, cfile %ld, length %u color %d rop %d\n",
 		      bmin, bmax,
-		      (long)(clist_ftell(bfile) - sizeof(ss->b_this)), /* stefan foo was: 2 * sizeof ?? */
+		      (long)(io_procs->ftell(bfile) - sizeof(ss->b_this)), /* stefan foo was: 2 * sizeof ?? */
 		      (long)pos, left, ss->b_this.band_complexity.uses_color,
 		      ss->b_this.band_complexity.nontrivial_rops);
 	}
@@ -505,13 +507,13 @@
 
     /* If this is a saved page, open the files. */
     if (rs.page_cfile == 0) {
-	code = clist_fopen(rs.page_cfname,
+	code = crdev->page_info.io_procs->fopen(rs.page_cfname,
 			   gp_fmode_rb, &rs.page_cfile, crdev->bandlist_memory,
 			   crdev->bandlist_memory, true);
 	opened_cfile = (code >= 0);
     }
     if (rs.page_bfile == 0 && code >= 0) {
-	code = clist_fopen(rs.page_bfname,
+	code = crdev->page_info.io_procs->fopen(rs.page_bfname,
 			   gp_fmode_rb, &rs.page_bfile, crdev->bandlist_memory,
 			   crdev->bandlist_memory, false);
 	opened_bfile = (code >= 0);
@@ -535,9 +537,9 @@
 
     /* Close the files if we just opened them. */
     if (opened_bfile && rs.page_bfile != 0)
-	clist_fclose(rs.page_bfile, rs.page_bfname, false);
+	crdev->page_info.io_procs->fclose(rs.page_bfile, rs.page_bfname, false);
     if (opened_cfile && rs.page_cfile != 0)
-	clist_fclose(rs.page_cfile, rs.page_cfname, false);
+	crdev->page_info.io_procs->fclose(rs.page_cfile, rs.page_cfname, false);
 
     return code;
 }
@@ -585,15 +587,15 @@
 	rs.band_last = crdev->nbands;
 	rs.page_info = crdev->page_info;
 
-	save_pos = clist_ftell(rs.page_bfile);
-	clist_fseek(rs.page_bfile, pos, SEEK_SET, rs.page_bfname);
+	save_pos = crdev->page_info.io_procs->ftell(rs.page_bfile);
+	crdev->page_info.io_procs->fseek(rs.page_bfile, pos, SEEK_SET, rs.page_bfname);
 
 	for (i=0; i < crdev->nbands; i++) {
-	    clist_fread_chars(&cb, sizeof(cb), rs.page_bfile);
+	    crdev->page_info.io_procs->fread_chars(&cb, sizeof(cb), rs.page_bfile);
 	    crdev->band_complexity_array[i] = cb.band_complexity;
 	}
 
-	clist_fseek(rs.page_bfile, save_pos, SEEK_SET, rs.page_bfname);
+	crdev->page_info.io_procs->fseek(rs.page_bfile, save_pos, SEEK_SET, rs.page_bfname);
 	code = 0;  
     }
     return code;

Modified: trunk/gs/src/gxclutil.c
===================================================================
--- trunk/gs/src/gxclutil.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxclutil.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -143,11 +143,11 @@
  	    return_error(gs_error_ioerror);
 	cb.band_min = band_min;
 	cb.band_max = band_max;
-	cb.pos = clist_ftell(cfile);
+	cb.pos = cldev->page_info.io_procs->ftell(cfile);
 	clist_copy_band_complexity(&cb.band_complexity, band_complexity);  
 	if_debug4('l', "[l]writing for bands (%d,%d) at %ld K %d \n",
 		  band_min, band_max, (long)cb.pos, cb.band_complexity.uses_color);
-	clist_fwrite_chars(&cb, sizeof(cb), bfile);
+	cldev->page_info.io_procs->fwrite_chars(&cb, sizeof(cb), bfile);
 	if (cp != 0) {
 	    pcl->tail->next = 0;	/* terminate the list */
 	    for (; cp != 0; cp = cp->next) {
@@ -160,14 +160,14 @@
 		    return_error(gs_error_Fatal);
 		}
 #endif
-		clist_fwrite_chars(cp + 1, cp->size, cfile);
+		cldev->page_info.io_procs->fwrite_chars(cp + 1, cp->size, cfile);
 	    }
 	    pcl->head = pcl->tail = 0;
 	}
-	clist_fwrite_chars(&end, 1, cfile);
+	cldev->page_info.io_procs->fwrite_chars(&end, 1, cfile);
 	process_interrupts(cldev->memory);
-	code_b = clist_ferror_code(bfile);
-	code_c = clist_ferror_code(cfile);
+	code_b = cldev->page_info.io_procs->ferror_code(bfile);
+	code_c = cldev->page_info.io_procs->ferror_code(cfile);
 	if (code_b < 0)
 	    return_error(code_b);
 	if (code_c < 0)

Modified: trunk/gs/src/gxpageq.c
===================================================================
--- trunk/gs/src/gxpageq.c	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxpageq.c	2007-04-09 08:54:30 UTC (rev 7837)
@@ -272,7 +272,7 @@
 /* Add page to a page queue */
 /* Even if an error is returned, entry will have been added to queue! */
 int				/* rets 0 ok, gs_error_VMerror if error */
-gx_page_queue_add_page(
+gx_page_queue_add_page(gx_device_clist_writer *const pcwdev,
 			  gx_page_queue_t * queue,	/* page queue to add to */
 			  gx_page_queue_action_t action,	/* action code to queue */
 			  const gx_band_page_info_t * page_info,  /* bandinfo incl. bandlist (or 0) */
@@ -296,8 +296,10 @@
     entry->action = action;
     if (page_info != 0)
 	entry->page_info = *page_info;
-    else
+    else {
 	entry->page_info = null_page_info;
+	entry->page_info.io_procs = pcwdev->io_procs;
+    }
     entry->num_copies = page_count;
 
     /* Stick onto page queue & signal */

Modified: trunk/gs/src/gxpageq.h
===================================================================
--- trunk/gs/src/gxpageq.h	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/gxpageq.h	2007-04-09 08:54:30 UTC (rev 7837)
@@ -227,6 +227,7 @@
  */
 /* rets 0 ok, gs_error_Fatal if error */
 int gx_page_queue_add_page(
+    gx_device_clist_writer *const pcwdev,
     gx_page_queue_t * queue,		/* page queue to add to */
     gx_page_queue_action_t action,		/* action code to queue */
     const gx_band_page_info_t * page_info,	/* bandinfo incl. bandlist */

Modified: trunk/gs/src/lib.mak
===================================================================
--- trunk/gs/src/lib.mak	2007-04-09 03:18:38 UTC (rev 7836)
+++ trunk/gs/src/lib.mak	2007-04-09 08:54:30 UTC (rev 7837)
@@ -1709,6 +1709,7 @@
 clfile_=$(GLOBJ)gxclfile.$(OBJ)
 $(GLD)clfile.dev : $(LIB_MAK) $(ECHOGS_XE) $(clfile_)
 	$(SETMOD) $(GLD)clfile $(clfile_)
+	$(ADDMOD) $(GLD)clfile -init gxclfile
 
 $(GLOBJ)gxclfile.$(OBJ) : $(GLSRC)gxclfile.c $(stdio__h) $(string__h)\
  $(gp_h) $(gsmemory_h) $(gserror_h) $(gserrors_h) $(gxclio_h)
@@ -1721,6 +1722,7 @@
 	$(SETMOD) $(GLD)clmemory $(clmemory_)
 	$(ADDMOD) $(GLD)clmemory -include $(GLD)s$(BAND_LIST_COMPRESSOR)e
 	$(ADDMOD) $(GLD)clmemory -include $(GLD)s$(BAND_LIST_COMPRESSOR)d
+	$(ADDMOD) $(GLD)clmemory -init gxclmem
 	$(ADDMOD) $(GLD)clmemory -init cl_$(BAND_LIST_COMPRESSOR)
 
 gxclmem_h=$(GLSRC)gxclmem.h $(gxclio_h) $(strimpl_h)



More information about the gs-cvs mailing list