This is util.c in view mode; [Download] [Up]
/* * Copyright (c) 1994 Paul Vojta. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * NOTE: * xdvi is based on prior work as noted in the modification history, below. */ /* * DVI previewer for X. * * Eric Cooper, CMU, September 1985. * * Code derived from dvi-imagen.c. * * Modification history: * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS. * 7/1988 Modified for X.11 --Mark Eichin, MIT * 12/1988 Added 'R' option, toolkit, magnifying glass * --Paul Vojta, UC Berkeley. * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ. * 3/1990 Added VMS support --Scott Allendorf, U of Iowa * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen * and Lee Hetherington, MIT * 4/1994 Added DPS support, bounding box * --Ricardo Telichevesky * and Luis Miguel Silveira, MIT RLE. */ #include "config.h" #include <kpathsea/c-fopen.h> #include <kpathsea/c-vararg.h> #ifdef Mips extern int errno; #endif #ifdef VMS #include <rmsdef.h> #endif /* VMS */ /* * General utility routines. */ /* * Print error message and quit. */ #if NeedVarargsPrototypes NORETURN void oops(_Xconst char *message, ...) #else /* VARARGS */ NORETURN void oops(va_alist) va_dcl #endif { #if !NeedVarargsPrototypes _Xconst char *message; #endif va_list args; Fprintf(stderr, "%s: ", prog); #if NeedVarargsPrototypes va_start(args, message); #else va_start(args); message = va_arg(args, _Xconst char *); #endif (void) vfprintf(stderr, message, args); va_end(args); Putc('\n', stderr); exit(1); } /* * Either allocate storage or fail with explanation. */ char * xmalloc(size, why) unsigned size; _Xconst char *why; { /* Avoid malloc(0), though it's not clear if it ever actually happens any more. */ char *mem = malloc(size ? size : 1); if (mem == NULL) oops("! Cannot allocate %u bytes for %s.\n", size, why); return mem; } /* * Allocate bitmap for given font and character */ void alloc_bitmap(bitmap) register struct bitmap *bitmap; { register unsigned int size; /* width must be multiple of 16 bits for raster_op */ bitmap->bytes_wide = ROUNDUP((int) bitmap->w, BITS_PER_BMUNIT) * BYTES_PER_BMUNIT; size = bitmap->bytes_wide * bitmap->h; bitmap->bits = xmalloc(size != 0 ? size : 1, "character bitmap"); } /* * Close the pixel file for the least recently used font. */ static void close_a_file() { register struct font *fontp; unsigned short oldest = ~0; struct font *f = NULL; for (fontp = font_head; fontp != NULL; fontp = fontp->next) if (fontp->file != NULL && fontp->timestamp <= oldest) { f = fontp; oldest = fontp->timestamp; } if (f == NULL) oops("Can't find an open pixel file to close"); Fclose(f->file); f->file = NULL; ++n_files_left; } /* * Open a file in the given mode. */ FILE * #ifndef VMS xfopen(filename, type) _Xconst char *filename; _Xconst char *type; #define TYPE type #else xfopen(filename, type, type2) _Xconst char *filename; _Xconst char *type; _Xconst char *type2; #define TYPE type, type2 #endif /* VMS */ { FILE *f; /* Try not to let the file table fill up completely. */ if (n_files_left <= 5) close_a_file(); f = fopen(filename, OPEN_MODE); /* If the open failed, try closing a file unconditionally. Interactive Unix 2.2.1, at least, doesn't set errno to EMFILE or ENFILE even when it should. In any case, it doesn't hurt much to always try. */ if (f == NULL) { n_files_left = 0; close_a_file(); f = fopen(filename, TYPE); } return f; } #undef TYPE #ifdef PS_GS /* * Create a pipe, closing a file if necessary. This is (so far) used only * in psgs.c. */ int xpipe(fd) int *fd; { int retval; for (;;) { retval = pipe(fd); if (retval == 0 || (errno != EMFILE && errno != ENFILE)) break; n_files_left = 0; close_a_file(); } return retval; } #endif /* PS_GS */ /* * * Read size bytes from the FILE fp, constructing them into a * signed/unsigned integer. * */ unsigned long num(fp, size) register FILE *fp; register int size; { register long x = 0; while (size--) x = (x << 8) | one(fp); return x; } long snum(fp, size) register FILE *fp; register int size; { register long x; #ifdef __STDC__ x = (signed char) getc(fp); #else x = (unsigned char) getc(fp); if (x & 0x80) x -= 0x100; #endif while (--size) x = (x << 8) | one(fp); return x; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.