Doxygen Source Code Documentation
jmemdos.c File Reference
#include "jinclude.h"
#include "jpeglib.h"
#include "jmemsys.h"
Go to the source code of this file.
Data Structures | |
struct | EMScontext |
union | EMSspec |
struct | XMScontext |
union | XMSPTR |
struct | XMSspec |
Defines | |
#define | XMS_SUPPORTED 1 |
#define | EMS_SUPPORTED 1 |
#define | JPEG_INTERNALS |
#define | far_malloc(x) malloc(x) |
#define | far_free(x) free(x) |
#define | READ_BINARY "rb" |
#define | DEFAULT_MAX_MEM 300000L |
#define | ODD(X) (((X) & 1L) != 0) |
#define | FIELD_AT(spec, offset, type) (*((type *) &(spec.bytes[offset]))) |
#define | SRC_TYPE(spec) FIELD_AT(spec,4,char) |
#define | SRC_HANDLE(spec) FIELD_AT(spec,5,EMSH) |
#define | SRC_OFFSET(spec) FIELD_AT(spec,7,unsigned short) |
#define | SRC_PAGE(spec) FIELD_AT(spec,9,unsigned short) |
#define | SRC_PTR(spec) FIELD_AT(spec,7,EMSPTR) |
#define | DST_TYPE(spec) FIELD_AT(spec,11,char) |
#define | DST_HANDLE(spec) FIELD_AT(spec,12,EMSH) |
#define | DST_OFFSET(spec) FIELD_AT(spec,14,unsigned short) |
#define | DST_PAGE(spec) FIELD_AT(spec,16,unsigned short) |
#define | DST_PTR(spec) FIELD_AT(spec,14,EMSPTR) |
#define | EMSPAGESIZE 16384L |
#define | HIBYTE(W) (((W) >> 8) & 0xFF) |
#define | LOBYTE(W) ((W) & 0xFF) |
Typedefs | |
typedef void far * | EMSPTR |
Functions | |
void *malloc | JPP ((size_t size)) |
void free | JPP ((void *ptr)) |
char *getenv | JPP ((const char *name)) |
short far jdos_open | JPP ((short far *handle, char far *filename)) |
short far jdos_close | JPP ((short handle)) |
short far jdos_seek | JPP ((short handle, long offset)) |
short far jdos_read | JPP ((short handle, void far *buffer, unsigned short count)) |
void far jxms_getdriver | JPP ((XMSDRIVER far *)) |
void far jxms_calldriver | JPP ((XMSDRIVER, XMScontext far *)) |
short far jems_available | JPP ((void)) |
void far jems_calldriver | JPP ((EMScontext far *)) |
select_file_name (char *fname) | |
jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) | |
jpeg_free_small (j_common_ptr cinfo, void *object, size_t sizeofobject) | |
jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) | |
jpeg_free_large (j_common_ptr cinfo, void FAR *object, size_t sizeofobject) | |
jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, long max_bytes_needed, long already_allocated) | |
read_file_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
write_file_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
close_file_store (j_common_ptr cinfo, backing_store_ptr info) | |
open_file_store (j_common_ptr cinfo, backing_store_ptr info, long total_bytes_needed) | |
read_xms_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
write_xms_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
close_xms_store (j_common_ptr cinfo, backing_store_ptr info) | |
open_xms_store (j_common_ptr cinfo, backing_store_ptr info, long total_bytes_needed) | |
read_ems_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
write_ems_store (j_common_ptr cinfo, backing_store_ptr info, void FAR *buffer_address, long file_offset, long byte_count) | |
close_ems_store (j_common_ptr cinfo, backing_store_ptr info) | |
open_ems_store (j_common_ptr cinfo, backing_store_ptr info, long total_bytes_needed) | |
jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, long total_bytes_needed) | |
jpeg_mem_init (j_common_ptr cinfo) | |
jpeg_mem_term (j_common_ptr cinfo) | |
Variables | |
You forgot to define USE_MSDOS_MEMMGR in jconfig h MAX_ALLOC_CHUNK should be less than K typedef void far * | XMSDRIVER |
int | next_file_num |
XMSDRIVER | xms_driver |
Define Documentation
|
Definition at line 204 of file jmemdos.c. Referenced by jpeg_mem_init(). |
|
Definition at line 479 of file jmemdos.c. Referenced by read_ems_store(), and write_ems_store(). |
|
Definition at line 480 of file jmemdos.c. Referenced by write_ems_store(). |
|
Definition at line 481 of file jmemdos.c. Referenced by write_ems_store(). |
|
Definition at line 482 of file jmemdos.c. Referenced by read_ems_store(). |
|
Definition at line 478 of file jmemdos.c. Referenced by read_ems_store(), and write_ems_store(). |
|
|
|
Definition at line 484 of file jmemdos.c. Referenced by open_ems_store(), read_ems_store(), and write_ems_store(). |
|
Definition at line 70 of file jmemdos.c. Referenced by jpeg_free_large(). |
|
Definition at line 69 of file jmemdos.c. Referenced by jpeg_get_large(). |
|
|
|
Definition at line 486 of file jmemdos.c. Referenced by open_ems_store(), read_ems_store(), and write_ems_store(). |
|
|
|
Definition at line 487 of file jmemdos.c. Referenced by open_ems_store(). |
|
Definition at line 329 of file jmemdos.c. Referenced by read_xms_store(), and write_xms_store(). |
|
Definition at line 77 of file jmemdos.c. Referenced by select_file_name(). |
|
Definition at line 474 of file jmemdos.c. Referenced by read_ems_store(), and write_ems_store(). |
|
Definition at line 475 of file jmemdos.c. Referenced by read_ems_store(). |
|
Definition at line 476 of file jmemdos.c. Referenced by read_ems_store(). |
|
Definition at line 477 of file jmemdos.c. Referenced by write_ems_store(). |
|
Definition at line 473 of file jmemdos.c. Referenced by read_ems_store(), and write_ems_store(). |
|
|
Typedef Documentation
|
|
Function Documentation
|
Definition at line 541 of file jmemdos.c. References EMScontext::ax, EMScontext::dx, far, and TRACEMS1. Referenced by open_ems_store().
00542 { 00543 EMScontext ctx; 00544 00545 ctx.ax = 0x4500; 00546 ctx.dx = info->handle.ems_handle; 00547 jems_calldriver((EMScontext far *) & ctx); 00548 TRACEMS1(cinfo, 1, JTRC_EMS_CLOSE, info->handle.ems_handle); 00549 /* we ignore any error return from the driver */ 00550 } |
|
Definition at line 275 of file jmemdos.c. References backing_store_struct::temp_name, and TRACEMSS. Referenced by open_file_store().
00276 { 00277 jdos_close(info->handle.file_handle); /* close the file */ 00278 remove(info->temp_name); /* delete the file */ 00279 /* If your system doesn't have remove(), try unlink() instead. 00280 * remove() is the ANSI-standard name for this function, but 00281 * unlink() was more common in pre-ANSI systems. 00282 */ 00283 TRACEMSS(cinfo, 1, JTRC_TFILE_CLOSE, info->temp_name); 00284 } |
|
Definition at line 401 of file jmemdos.c. References XMScontext::ax, XMScontext::dx, far, TRACEMS1, and xms_driver. Referenced by open_xms_store().
00402 { 00403 XMScontext ctx; 00404 00405 ctx.dx = info->handle.xms_handle; 00406 ctx.ax = 0x0a00; 00407 jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 00408 TRACEMS1(cinfo, 1, JTRC_XMS_CLOSE, info->handle.xms_handle); 00409 /* we ignore any error return from the driver */ 00410 } |
|
Definition at line 189 of file jmemdos.c. References far_free, object, and sizeofobject.
|
|
Definition at line 172 of file jmemdos.c. References free, object, and sizeofobject.
|
|
Definition at line 183 of file jmemdos.c. References far_malloc, and sizeofobject.
00184 { 00185 return (void FAR *) far_malloc(sizeofobject); 00186 } |
|
Definition at line 166 of file jmemdos.c. References malloc, and sizeofobject.
00167 { 00168 return (void *) malloc(sizeofobject); 00169 } |
|
Definition at line 208 of file jmemdos.c. References already_allocated, max_bytes_needed, and min_bytes_needed.
00210 { 00211 return cinfo->mem->max_memory_to_use - already_allocated; 00212 } |
|
Definition at line 623 of file jmemdos.c. References DEFAULT_MAX_MEM, and next_file_num.
00624 { 00625 next_file_num = 0; /* initialize temp file name generator */ 00626 return DEFAULT_MAX_MEM; /* default for max_memory_to_use */ 00627 } |
|
Definition at line 630 of file jmemdos.c.
00631 { 00632 /* Microsoft C, at least in v6.00A, will not successfully reclaim freed 00633 * blocks of size > 32Kbytes unless we give it a kick in the rear, like so: 00634 */ 00635 #ifdef NEED_FHEAPMIN 00636 _fheapmin(); 00637 #endif 00638 } |
|
Definition at line 599 of file jmemdos.c. References ERREXITS, open_ems_store(), open_file_store(), open_xms_store(), and total_bytes_needed.
00601 { 00602 /* Try extended memory, then expanded memory, then regular file. */ 00603 #if XMS_SUPPORTED 00604 if (open_xms_store(cinfo, info, total_bytes_needed)) 00605 return; 00606 #endif 00607 #if EMS_SUPPORTED 00608 if (open_ems_store(cinfo, info, total_bytes_needed)) 00609 return; 00610 #endif 00611 if (open_file_store(cinfo, info, total_bytes_needed)) 00612 return; 00613 ERREXITS(cinfo, JERR_TFILE_CREATE, ""); 00614 } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 554 of file jmemdos.c. References EMScontext::ax, EMScontext::bx, close_ems_store(), EMScontext::dx, EMSPAGESIZE, far, HIBYTE, L, LOBYTE, read_ems_store(), total_bytes_needed, TRACEMS1, and write_ems_store(). Referenced by jpeg_open_backing_store().
00556 { 00557 EMScontext ctx; 00558 00559 /* Is EMS driver there? */ 00560 if (! jems_available()) 00561 return FALSE; 00562 00563 /* Get status, make sure EMS is OK */ 00564 ctx.ax = 0x4000; 00565 jems_calldriver((EMScontext far *) & ctx); 00566 if (HIBYTE(ctx.ax) != 0) 00567 return FALSE; 00568 00569 /* Get version, must be >= 4.0 */ 00570 ctx.ax = 0x4600; 00571 jems_calldriver((EMScontext far *) & ctx); 00572 if (HIBYTE(ctx.ax) != 0 || LOBYTE(ctx.ax) < 0x40) 00573 return FALSE; 00574 00575 /* Try to allocate requested space */ 00576 ctx.ax = 0x4300; 00577 ctx.bx = (unsigned short) ((total_bytes_needed + EMSPAGESIZE-1L) / EMSPAGESIZE); 00578 jems_calldriver((EMScontext far *) & ctx); 00579 if (HIBYTE(ctx.ax) != 0) 00580 return FALSE; 00581 00582 /* Succeeded, save the handle and away we go */ 00583 info->handle.ems_handle = ctx.dx; 00584 info->read_backing_store = read_ems_store; 00585 info->write_backing_store = write_ems_store; 00586 info->close_backing_store = close_ems_store; 00587 TRACEMS1(cinfo, 1, JTRC_EMS_OPEN, ctx.dx); 00588 return TRUE; /* succeeded */ 00589 } |
|
Definition at line 288 of file jmemdos.c. References close_file_store(), ERREXITS, far, read_file_store(), select_file_name(), backing_store_struct::temp_name, total_bytes_needed, TRACEMSS, and write_file_store(). Referenced by jpeg_open_backing_store().
00290 { 00291 short handle; 00292 00293 select_file_name(info->temp_name); 00294 if (jdos_open((short far *) & handle, (char far *) info->temp_name)) { 00295 /* might as well exit since jpeg_open_backing_store will fail anyway */ 00296 ERREXITS(cinfo, JERR_TFILE_CREATE, info->temp_name); 00297 return FALSE; 00298 } 00299 info->handle.file_handle = handle; 00300 info->read_backing_store = read_file_store; 00301 info->write_backing_store = write_file_store; 00302 info->close_backing_store = close_file_store; 00303 TRACEMSS(cinfo, 1, JTRC_TFILE_OPEN, info->temp_name); 00304 return TRUE; /* succeeded */ 00305 } |
|
Definition at line 414 of file jmemdos.c. References XMScontext::ax, close_xms_store(), XMScontext::dx, far, L, read_xms_store(), total_bytes_needed, TRACEMS1, write_xms_store(), xms_driver, and XMSDRIVER. Referenced by jpeg_open_backing_store().
00416 { 00417 XMScontext ctx; 00418 00419 /* Get address of XMS driver */ 00420 jxms_getdriver((XMSDRIVER far *) & xms_driver); 00421 if (xms_driver == NULL) 00422 return FALSE; /* no driver to be had */ 00423 00424 /* Get version number, must be >= 2.00 */ 00425 ctx.ax = 0x0000; 00426 jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 00427 if (ctx.ax < (unsigned short) 0x0200) 00428 return FALSE; 00429 00430 /* Try to get space (expressed in kilobytes) */ 00431 ctx.dx = (unsigned short) ((total_bytes_needed + 1023L) >> 10); 00432 ctx.ax = 0x0900; 00433 jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 00434 if (ctx.ax != 1) 00435 return FALSE; 00436 00437 /* Succeeded, save the handle and away we go */ 00438 info->handle.xms_handle = ctx.dx; 00439 info->read_backing_store = read_xms_store; 00440 info->write_backing_store = write_xms_store; 00441 info->close_backing_store = close_xms_store; 00442 TRACEMS1(cinfo, 1, JTRC_XMS_OPEN, ctx.dx); 00443 return TRUE; /* succeeded */ 00444 } |
|
Definition at line 491 of file jmemdos.c. References EMScontext::ax, EMScontext::ds_si, DST_HANDLE, DST_PTR, DST_TYPE, EMSPAGESIZE, ERREXIT, far, HIBYTE, EMSspec::length, SRC_HANDLE, SRC_OFFSET, SRC_PAGE, and SRC_TYPE. Referenced by open_ems_store().
00494 { 00495 EMScontext ctx; 00496 EMSspec spec; 00497 00498 spec.length = byte_count; 00499 SRC_TYPE(spec) = 1; 00500 SRC_HANDLE(spec) = info->handle.ems_handle; 00501 SRC_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); 00502 SRC_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); 00503 DST_TYPE(spec) = 0; 00504 DST_HANDLE(spec) = 0; 00505 DST_PTR(spec) = buffer_address; 00506 00507 ctx.ds_si = (void far *) & spec; 00508 ctx.ax = 0x5700; /* move memory region */ 00509 jems_calldriver((EMScontext far *) & ctx); 00510 if (HIBYTE(ctx.ax) != 0) 00511 ERREXIT(cinfo, JERR_EMS_READ); 00512 } |
|
Definition at line 243 of file jmemdos.c. Referenced by open_file_store().
00246 { 00247 if (jdos_seek(info->handle.file_handle, file_offset)) 00248 ERREXIT(cinfo, JERR_TFILE_SEEK); 00249 /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ 00250 if (byte_count > 65535L) /* safety check */ 00251 ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); 00252 if (jdos_read(info->handle.file_handle, buffer_address, 00253 (unsigned short) byte_count)) 00254 ERREXIT(cinfo, JERR_TFILE_READ); 00255 } |
|
Definition at line 333 of file jmemdos.c. References XMScontext::ax, XMScontext::ds_si, XMSspec::dst, XMSspec::dst_handle, ERREXIT, far, L, XMSspec::length, ODD, XMSPTR::offset, XMSPTR::ptr, XMSspec::src, XMSspec::src_handle, and xms_driver. Referenced by open_xms_store(), and write_xms_store().
00336 { 00337 XMScontext ctx; 00338 XMSspec spec; 00339 char endbuffer[2]; 00340 00341 /* The XMS driver can't cope with an odd length, so handle the last byte 00342 * specially if byte_count is odd. We don't expect this to be common. 00343 */ 00344 00345 spec.length = byte_count & (~ 1L); 00346 spec.src_handle = info->handle.xms_handle; 00347 spec.src.offset = file_offset; 00348 spec.dst_handle = 0; 00349 spec.dst.ptr = buffer_address; 00350 00351 ctx.ds_si = (void far *) & spec; 00352 ctx.ax = 0x0b00; /* EMB move */ 00353 jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 00354 if (ctx.ax != 1) 00355 ERREXIT(cinfo, JERR_XMS_READ); 00356 00357 if (ODD(byte_count)) { 00358 read_xms_store(cinfo, info, (void FAR *) endbuffer, 00359 file_offset + byte_count - 1L, 2L); 00360 ((char FAR *) buffer_address)[byte_count - 1L] = endbuffer[0]; 00361 } 00362 } |
|
Definition at line 128 of file jmemdos.c. References getenv(), next_file_num, and READ_BINARY.
00129 { 00130 const char * env; 00131 char * ptr; 00132 FILE * tfile; 00133 00134 /* Keep generating file names till we find one that's not in use */ 00135 for (;;) { 00136 /* Get temp directory name from environment TMP or TEMP variable; 00137 * if none, use "." 00138 */ 00139 if ((env = (const char *) getenv("TMP")) == NULL) 00140 if ((env = (const char *) getenv("TEMP")) == NULL) 00141 env = "."; 00142 if (*env == '\0') /* null string means "." */ 00143 env = "."; 00144 ptr = fname; /* copy name to fname */ 00145 while (*env != '\0') 00146 *ptr++ = *env++; 00147 if (ptr[-1] != '\\' && ptr[-1] != '/') 00148 *ptr++ = '\\'; /* append backslash if not in env variable */ 00149 /* Append a suitable file name */ 00150 next_file_num++; /* advance counter */ 00151 sprintf(ptr, "JPG%03d.TMP", next_file_num); 00152 /* Probe to see if file name is already in use */ 00153 if ((tfile = fopen(fname, READ_BINARY)) == NULL) 00154 break; 00155 fclose(tfile); /* oops, it's there; close tfile & try again */ 00156 } 00157 } |
|
Definition at line 516 of file jmemdos.c. References EMScontext::ax, EMScontext::ds_si, DST_HANDLE, DST_OFFSET, DST_PAGE, DST_TYPE, EMSPAGESIZE, ERREXIT, far, HIBYTE, EMSspec::length, SRC_HANDLE, SRC_PTR, and SRC_TYPE. Referenced by open_ems_store().
00519 { 00520 EMScontext ctx; 00521 EMSspec spec; 00522 00523 spec.length = byte_count; 00524 SRC_TYPE(spec) = 0; 00525 SRC_HANDLE(spec) = 0; 00526 SRC_PTR(spec) = buffer_address; 00527 DST_TYPE(spec) = 1; 00528 DST_HANDLE(spec) = info->handle.ems_handle; 00529 DST_PAGE(spec) = (unsigned short) (file_offset / EMSPAGESIZE); 00530 DST_OFFSET(spec) = (unsigned short) (file_offset % EMSPAGESIZE); 00531 00532 ctx.ds_si = (void far *) & spec; 00533 ctx.ax = 0x5700; /* move memory region */ 00534 jems_calldriver((EMScontext far *) & ctx); 00535 if (HIBYTE(ctx.ax) != 0) 00536 ERREXIT(cinfo, JERR_EMS_WRITE); 00537 } |
|
Definition at line 259 of file jmemdos.c. References ERREXIT, JERR_TFILE_WRITE, and L. Referenced by open_file_store().
00262 { 00263 if (jdos_seek(info->handle.file_handle, file_offset)) 00264 ERREXIT(cinfo, JERR_TFILE_SEEK); 00265 /* Since MAX_ALLOC_CHUNK is less than 64K, byte_count will be too. */ 00266 if (byte_count > 65535L) /* safety check */ 00267 ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); 00268 if (jdos_write(info->handle.file_handle, buffer_address, 00269 (unsigned short) byte_count)) 00270 ERREXIT(cinfo, JERR_TFILE_WRITE); 00271 } |
|
Definition at line 366 of file jmemdos.c. References XMScontext::ax, XMScontext::ds_si, XMSspec::dst, XMSspec::dst_handle, ERREXIT, far, L, XMSspec::length, ODD, XMSPTR::offset, XMSPTR::ptr, read_xms_store(), XMSspec::src, XMSspec::src_handle, and xms_driver. Referenced by open_xms_store().
00369 { 00370 XMScontext ctx; 00371 XMSspec spec; 00372 char endbuffer[2]; 00373 00374 /* The XMS driver can't cope with an odd length, so handle the last byte 00375 * specially if byte_count is odd. We don't expect this to be common. 00376 */ 00377 00378 spec.length = byte_count & (~ 1L); 00379 spec.src_handle = 0; 00380 spec.src.ptr = buffer_address; 00381 spec.dst_handle = info->handle.xms_handle; 00382 spec.dst.offset = file_offset; 00383 00384 ctx.ds_si = (void far *) & spec; 00385 ctx.ax = 0x0b00; /* EMB move */ 00386 jxms_calldriver(xms_driver, (XMScontext far *) & ctx); 00387 if (ctx.ax != 1) 00388 ERREXIT(cinfo, JERR_XMS_WRITE); 00389 00390 if (ODD(byte_count)) { 00391 read_xms_store(cinfo, info, (void FAR *) endbuffer, 00392 file_offset + byte_count - 1L, 2L); 00393 endbuffer[0] = ((char FAR *) buffer_address)[byte_count - 1L]; 00394 write_xms_store(cinfo, info, (void FAR *) endbuffer, 00395 file_offset + byte_count - 1L, 2L); 00396 } 00397 } |
Variable Documentation
|
Definition at line 125 of file jmemdos.c. Referenced by jpeg_mem_init(), and select_file_name(). |
|
Definition at line 314 of file jmemdos.c. Referenced by close_xms_store(), open_xms_store(), read_xms_store(), and write_xms_store(). |
|
Definition at line 97 of file jmemdos.c. Referenced by open_xms_store(). |