source: trunk/third/firefox/jpeg/jmemname.c @ 21695

Revision 21695, 8.1 KB checked in by rbasch, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21694, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 * jmemname.c
3 *
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.
7 *
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.
13 */
14
15#define JPEG_INTERNALS
16#include "jinclude.h"
17#include "jpeglib.h"
18#include "jmemsys.h"            /* import the system-dependent declarations */
19
20#ifndef HAVE_STDLIB_H           /* <stdlib.h> should declare malloc(),free() */
21extern void * malloc JPP((size_t size));
22extern void free JPP((void *ptr));
23#endif
24
25#ifndef SEEK_SET                /* pre-ANSI systems may not define this; */
26#define SEEK_SET  0             /* if not, assume 0 is correct */
27#endif
28
29#ifdef DONT_USE_B_MODE          /* define mode parameters for fopen() */
30#define READ_BINARY     "r"
31#define RW_BINARY       "w+"
32#else
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"
39#endif
40#endif
41
42
43/*
44 * Selection of a file name for a temporary file.
45 * This is system-dependent!
46 *
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.
54 *
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.
59 *
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.)
64 *
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.
67 */
68
69#ifndef TEMP_DIRECTORY          /* can override from jconfig.h or Makefile */
70#define TEMP_DIRECTORY  "/usr/tmp/" /* recommended setting for Unix */
71#endif
72
73static int next_file_num;       /* to distinguish among several temp files */
74
75#ifdef NO_MKTEMP
76
77#ifndef TEMP_FILE_NAME          /* can override from jconfig.h or Makefile */
78#define TEMP_FILE_NAME  "%sJPG%03d.TMP"
79#endif
80
81#ifndef NO_ERRNO_H
82#include <errno.h>              /* to define ENOENT */
83#endif
84
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:
88 */
89#ifndef errno
90extern int errno;
91#endif
92
93
94LOCAL(void)
95select_file_name (char * fname)
96{
97  FILE * tfile;
98
99  /* Keep generating file names till we find one that's not in use */
100  for (;;) {
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.
107       */
108#ifdef ENOENT
109      if (errno != ENOENT)
110        continue;
111#endif
112      break;
113    }
114    fclose(tfile);              /* oops, it's there; close tfile & try again */
115  }
116}
117
118#else /* ! NO_MKTEMP */
119
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"
123#endif
124
125LOCAL(void)
126select_file_name (char * fname)
127{
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 */
132}
133
134#endif /* NO_MKTEMP */
135
136
137/*
138 * Memory allocation and freeing are controlled by the regular library
139 * routines malloc() and free().
140 */
141
142GLOBAL(void *)
143jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject)
144{
145  return (void *) malloc(sizeofobject);
146}
147
148GLOBAL(void)
149jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject)
150{
151  free(object);
152}
153
154
155/*
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.
160 */
161
162GLOBAL(void FAR *)
163jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject)
164{
165  return (void FAR *) malloc(sizeofobject);
166}
167
168GLOBAL(void)
169jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject)
170{
171  free(object);
172}
173
174
175/*
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.
181 */
182
183#ifndef DEFAULT_MAX_MEM         /* so can override from makefile */
184#define DEFAULT_MAX_MEM         1000000L /* default: one megabyte */
185#endif
186
187GLOBAL(long)
188jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed,
189                    long max_bytes_needed, long already_allocated)
190{
191  return cinfo->mem->max_memory_to_use - already_allocated;
192}
193
194
195/*
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.
200 */
201
202
203METHODDEF(void)
204read_backing_store (j_common_ptr cinfo, backing_store_ptr info,
205                    void FAR * buffer_address,
206                    long file_offset, long byte_count)
207{
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);
213}
214
215
216METHODDEF(void)
217write_backing_store (j_common_ptr cinfo, backing_store_ptr info,
218                     void FAR * buffer_address,
219                     long file_offset, long byte_count)
220{
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);
226}
227
228
229METHODDEF(void)
230close_backing_store (j_common_ptr cinfo, backing_store_ptr info)
231{
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?
237 */
238  TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name);
239}
240
241
242/*
243 * Initial opening of a backing-store object.
244 */
245
246GLOBAL(void)
247jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info,
248                         long total_bytes_needed)
249{
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);
257}
258
259
260/*
261 * These routines take care of any system-dependent initialization and
262 * cleanup required.
263 */
264
265GLOBAL(long)
266jpeg_mem_init (j_common_ptr cinfo)
267{
268  next_file_num = 0;            /* initialize temp file name generator */
269  return DEFAULT_MAX_MEM;       /* default for max_memory_to_use */
270}
271
272GLOBAL(void)
273jpeg_mem_term (j_common_ptr cinfo)
274{
275  /* no work */
276}
Note: See TracBrowser for help on using the repository browser.