]>
git.saurik.com Git - wxWidgets.git/blob - src/jpeg/jmemname.c
   4  * Copyright (C) 1992-1997, Thomas G. Lane. 
   5  * This file is part of the Independent JPEG Group's software. 
   6  * For conditions of distribution and use, see the accompanying README file. 
   8  * This file provides a generic implementation of the system-dependent 
   9  * portion of the JPEG memory manager.  This implementation assumes that 
  10  * you must explicitly construct a name for each temp file. 
  11  * Also, the problem of determining the amount of memory available 
  12  * is shoved onto the user. 
  15 #define JPEG_INTERNALS 
  18 #include "jmemsys.h"            /* import the system-dependent declarations */ 
  20 #ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare malloc(),free() */ 
  21 extern void * malloc 
JPP((size_t size
)); 
  22 extern void free 
JPP((void *ptr
)); 
  25 #ifndef SEEK_SET                /* pre-ANSI systems may not define this; */ 
  26 #define SEEK_SET  0             /* if not, assume 0 is correct */ 
  29 #ifdef DONT_USE_B_MODE          /* define mode parameters for fopen() */ 
  30 #define READ_BINARY     "r" 
  31 #define RW_BINARY       "w+" 
  33 #ifdef VMS                      /* VMS is very nonstandard */ 
  34 #define READ_BINARY     "rb", "ctx=stm" 
  35 #define RW_BINARY       "w+b", "ctx=stm" 
  36 #else                           /* standard ANSI-compliant case */ 
  37 #define READ_BINARY     "rb" 
  38 #define RW_BINARY       "w+b" 
  44  * Selection of a file name for a temporary file. 
  45  * This is system-dependent! 
  47  * The code as given is suitable for most Unix systems, and it is easily 
  48  * modified for most non-Unix systems.  Some notes: 
  49  *  1.  The temp file is created in the directory named by TEMP_DIRECTORY. 
  50  *      The default value is /usr/tmp, which is the conventional place for 
  51  *      creating large temp files on Unix.  On other systems you'll probably 
  52  *      want to change the file location.  You can do this by editing the 
  53  *      #define, or (preferred) by defining TEMP_DIRECTORY in jconfig.h. 
  55  *  2.  If you need to change the file name as well as its location, 
  56  *      you can override the TEMP_FILE_NAME macro.  (Note that this is 
  57  *      actually a printf format string; it must contain %s and %d.) 
  58  *      Few people should need to do this. 
  60  *  3.  mktemp() is used to ensure that multiple processes running 
  61  *      simultaneously won't select the same file names.  If your system 
  62  *      doesn't have mktemp(), define NO_MKTEMP to do it the hard way. 
  63  *      (If you don't have <errno.h>, also define NO_ERRNO_H.) 
  65  *  4.  You probably want to define NEED_SIGNAL_CATCHER so that cjpeg.c/djpeg.c 
  66  *      will cause the temp files to be removed if you stop the program early. 
  69 #ifndef TEMP_DIRECTORY          /* can override from jconfig.h or Makefile */ 
  70 #define TEMP_DIRECTORY  "/usr/tmp/" /* recommended setting for Unix */ 
  73 static int next_file_num
;       /* to distinguish among several temp files */ 
  77 #ifndef TEMP_FILE_NAME          /* can override from jconfig.h or Makefile */ 
  78 #define TEMP_FILE_NAME  "%sJPG%03d.TMP" 
  82 #include <errno.h>              /* to define ENOENT */ 
  85 /* ANSI C specifies that errno is a macro, but on older systems it's more 
  86  * likely to be a plain int variable.  And not all versions of errno.h 
  87  * bother to declare it, so we have to in order to be most portable.  Thus: 
  95 select_file_name (char * fname
) 
  99   /* Keep generating file names till we find one that's not in use */ 
 101     next_file_num
++;            /* advance counter */ 
 102     sprintf(fname
, TEMP_FILE_NAME
, TEMP_DIRECTORY
, next_file_num
); 
 103     if ((tfile 
= fopen(fname
, READ_BINARY
)) == NULL
) { 
 104       /* fopen could have failed for a reason other than the file not 
 105        * being there; for example, file there but unreadable. 
 106        * If <errno.h> isn't available, then we cannot test the cause. 
 114     fclose(tfile
);              /* oops, it's there; close tfile & try again */ 
 118 #else /* ! NO_MKTEMP */ 
 120 /* Note that mktemp() requires the initial filename to end in six X's */ 
 121 #ifndef TEMP_FILE_NAME          /* can override from jconfig.h or Makefile */ 
 122 #define TEMP_FILE_NAME  "%sJPG%dXXXXXX" 
 126 select_file_name (char * fname
) 
 128   next_file_num
++;              /* advance counter */ 
 129   sprintf(fname
, TEMP_FILE_NAME
, TEMP_DIRECTORY
, next_file_num
); 
 130   mktemp(fname
);                /* make sure file name is unique */ 
 131   /* mktemp replaces the trailing XXXXXX with a unique string of characters */ 
 134 #endif /* NO_MKTEMP */ 
 138  * Memory allocation and freeing are controlled by the regular library 
 139  * routines malloc() and free(). 
 143 jpeg_get_small (j_common_ptr cinfo
, size_t sizeofobject
) 
 145   return (void *) malloc(sizeofobject
); 
 149 jpeg_free_small (j_common_ptr cinfo
, void * object
, size_t sizeofobject
) 
 156  * "Large" objects are treated the same as "small" ones. 
 157  * NB: although we include FAR keywords in the routine declarations, 
 158  * this file won't actually work in 80x86 small/medium model; at least, 
 159  * you probably won't be able to process useful-size images in only 64KB. 
 163 jpeg_get_large (j_common_ptr cinfo
, size_t sizeofobject
) 
 165   return (void FAR 
*) malloc(sizeofobject
); 
 169 jpeg_free_large (j_common_ptr cinfo
, void FAR 
* object
, size_t sizeofobject
) 
 176  * This routine computes the total memory space available for allocation. 
 177  * It's impossible to do this in a portable way; our current solution is 
 178  * to make the user tell us (with a default value set at compile time). 
 179  * If you can actually get the available space, it's a good idea to subtract 
 180  * a slop factor of 5% or so. 
 183 #ifndef DEFAULT_MAX_MEM         /* so can override from makefile */ 
 184 #define DEFAULT_MAX_MEM         1000000L /* default: one megabyte */ 
 188 jpeg_mem_available (j_common_ptr cinfo
, long min_bytes_needed
, 
 189                     long max_bytes_needed
, long already_allocated
) 
 191   return cinfo
->mem
->max_memory_to_use 
- already_allocated
; 
 196  * Backing store (temporary file) management. 
 197  * Backing store objects are only used when the value returned by 
 198  * jpeg_mem_available is less than the total space needed.  You can dispense 
 199  * with these routines if you have plenty of virtual memory; see jmemnobs.c. 
 204 read_backing_store (j_common_ptr cinfo
, backing_store_ptr info
, 
 205                     void FAR 
* buffer_address
, 
 206                     long file_offset
, long byte_count
) 
 208   if (fseek(info
->temp_file
, file_offset
, SEEK_SET
)) 
 209     ERREXIT(cinfo
, JERR_TFILE_SEEK
); 
 210   if (JFREAD(info
->temp_file
, buffer_address
, byte_count
) 
 211       != (size_t) byte_count
) 
 212     ERREXIT(cinfo
, JERR_TFILE_READ
); 
 217 write_backing_store (j_common_ptr cinfo
, backing_store_ptr info
, 
 218                      void FAR 
* buffer_address
, 
 219                      long file_offset
, long byte_count
) 
 221   if (fseek(info
->temp_file
, file_offset
, SEEK_SET
)) 
 222     ERREXIT(cinfo
, JERR_TFILE_SEEK
); 
 223   if (JFWRITE(info
->temp_file
, buffer_address
, byte_count
) 
 224       != (size_t) byte_count
) 
 225     ERREXIT(cinfo
, JERR_TFILE_WRITE
); 
 230 close_backing_store (j_common_ptr cinfo
, backing_store_ptr info
) 
 232   fclose(info
->temp_file
);      /* close the file */ 
 233   unlink(info
->temp_name
);      /* delete the file */ 
 234 /* If your system doesn't have unlink(), use remove() instead. 
 235  * remove() is the ANSI-standard name for this function, but if 
 236  * your system was ANSI you'd be using jmemansi.c, right? 
 238   TRACEMSS(cinfo
, 1, JTRC_TFILE_CLOSE
, info
->temp_name
); 
 243  * Initial opening of a backing-store object. 
 247 jpeg_open_backing_store (j_common_ptr cinfo
, backing_store_ptr info
, 
 248                          long total_bytes_needed
) 
 250   select_file_name(info
->temp_name
); 
 251   if ((info
->temp_file 
= fopen(info
->temp_name
, RW_BINARY
)) == NULL
) 
 252     ERREXITS(cinfo
, JERR_TFILE_CREATE
, info
->temp_name
); 
 253   info
->read_backing_store 
= read_backing_store
; 
 254   info
->write_backing_store 
= write_backing_store
; 
 255   info
->close_backing_store 
= close_backing_store
; 
 256   TRACEMSS(cinfo
, 1, JTRC_TFILE_OPEN
, info
->temp_name
); 
 261  * These routines take care of any system-dependent initialization and 
 266 jpeg_mem_init (j_common_ptr cinfo
) 
 268   next_file_num 
= 0;            /* initialize temp file name generator */ 
 269   return DEFAULT_MAX_MEM
;       /* default for max_memory_to_use */ 
 273 jpeg_mem_term (j_common_ptr cinfo
)