1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
/*
* CJet: LaserJet emulation for Canon CaPSL III+ laser printers
* Copyright (C) 1996 Michael Huijsmans
* Email: mgh@sbox.tu-graz.ac.at
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
* misc.c - misc / aux functions and initialization
*
*/
#include "cjet.h"
/*
* Requests for temporary buffers (raster data decompression, dumps
* and font downloads) pass or die here. Allocates a buffer once and
* realloc() to grow on request. Avoids excessive malloc()ing.
* bdesc structure has to be initialized with initial block size !
*
* reqsize = new required size
* bdesc *f = pointer to buffer descriptor with current size
* returns pointer to block
*
*/
BYTE *get_buffer( int reqsize, bdesc *f)
{
if(f->p == NULL) { /* buffer is unallocated */
f->p = (BYTE *) malloc(f->size); /* allocate a block */
if(f->p == NULL) { /* that went wrong... */
MorePanic(UN_NOMEM,"malloc() of temporary storage buffer failed");
exit(1); /* ... and die. */
}
}
/* if we get to here, the buffer exists. Check for size */
if(reqsize > f->size) {
reqsize *= 2; /* make it larger for the future */
f->p = (BYTE *) realloc( f->p, reqsize);
f->size = reqsize;
if(f->p == NULL) {
MorePanic(UN_NOMEM," realloc() of storage buffer failed");
exit(1);
}
}
return (f->p);
}
/*
* program startup initialisation
* FIXME: do printer hard reset here; download new startup macro
*/
void cold_init( void )
{
buffer.p = NULL; /* no main buffer yet */
buffer.size = M_BUFFER_SIZE; /* initial size */
aux_buffer.p = NULL; /* no aux buffer yet */
aux_buffer.size = M_BUFFER_SIZE;
dec_buffer.p = NULL; /* no decompression buffer */
dec_buffer.size = M_DEC_SIZE;
mac_buffer.p = NULL; /* no macro buffer */
mac_buffer.size = M_MACRO_SIZE;
verbose = TRUE; /* noisy running */
ignorepaper = FALSE; /* don't ignore this */
ignore = FALSE; /* don't ignore download fonts */
paintmode = 0; /* use CaPSL partial paint mode */
page_x_offset = 0;
page_y_offset = 0;
}
/*
* reset printer defaults
* As this function can be called during execution, make sure no options
* from the command line are 'overruled'
* FIXME: let fonts registered as permanent survive
* FIXME: call startup macro defined by cold_init()
*/
void InitCaPSL(void)
{
paper_size = DEF_PAPER; /* default paper size is set in config.h */
landscape = FALSE;
line_spacing = 6; /* 6 lines per inch */
line_VMI = 120; /* 120/720 inch per line */
print_pitch = 10; /* 10 cpi */
print_HMI = 1000; /* 10 cpi * 100 */
top_margin = DEF_TOP_MARGIN;
bottom_margin = DEF_BOT_MARGIN;
last_top = -1; /* CaPSL: no margins are set on power up */
last_bot = -1;
left_margin = 0;
right_margin = 0; /* i.e. rightmost position */
shift_state = SI;
resolution = 75; /* startup resolution */
r_start = FALSE; /* no raster graphics */
r_compress = 0; /* no compression */
tface_p = DEF_TFACE; /* primary typeface; default Courier */
tface_s = DEF_TFACE; /* secondary typeface; default Courier */
set_p = DEF_SET; /* default symbol set */
set_s = DEF_SET;
char_size = 120; /* default font is 12pt */
CR_status = 0; /* CR=CR LF=LF FF=FF */
pos_unit = LINECOL; /* CaPSL default movement mode */
pos_sub_unit = DECIPTS; /* CaPSL default submode */
r_free = 0;
pos_index = STACKBEGIN; /* memorized position stack */
pcl_font_id = 0; /* PCL download font numbering begins here */
c_font_id = 0; /* CaPSL download font numbering */
c_font_used = 0; /* CaPSL number of used fonts */
kill_descriptors(); /* remove any font descriptor entries */
select_id = -1; /* no selected character set */
recording = FALSE; /* no macro recording in progress */
macro_id = -1; /* no current macro id */
/*
* Begin ISO mode; soft reset; paint mode; disable auto ff;
* enable scalable fonts
* select default symbol set
*/
PutString("\033;\033<\033[%d&z\033[?2h\033[?32h", paintmode);
SetSymbolSet( PRIMARY, DEF_SET);
paperinit(); /* init paper defaults */
/*
* move to new (adjusted) origin:
*/
PutString("\033[0;%d;2x", S_CURRENTTOP); /* restore top margin */
PutString("\033[0;%d;1x", S_CURRENTLEFT); /* restore left margin */
}
/*
* called at program termination:
* free lists and any used malloc()ed blocks.
*/
void terminate( void )
{
kill_descriptors();
if(buffer.p != NULL) {
MorePanic(UN_OTHER, "Buffer used: %d kB", (buffer.size / 1024));
free(buffer.p);
}
if(aux_buffer.p != NULL) {
MorePanic(UN_OTHER, "Aux buffer used: %d kB", (aux_buffer.size / 1024));
free(aux_buffer.p);
}
if(dec_buffer.p != NULL) {
MorePanic(UN_OTHER, "Dec buffer used: %d kB", (dec_buffer.size / 1024));
free(dec_buffer.p);
}
if(mac_buffer.p != NULL) {
MorePanic(UN_OTHER, "Macro buffer used: %d kB", (mac_buffer.size / 1024));
free(mac_buffer.p);
}
}
void MorePanic( int errtype, char *format, ...)
{
va_list stuff;
va_start(stuff, format);
if (verbose) {
fprintf(stderr, "%s: ", prog_name);
switch(errtype) {
case UN_CMD: fprintf(stderr, "Unrecognized command: "); break;
case UN_CLASS: fprintf(stderr, "Unrecognized class: "); break;
case UN_PARAM: fprintf(stderr, "Garbage in command parameter: "); break;
case UN_OTHER: break;
case UN_NOMEM: fprintf(stderr, "Out of memory: "); break;
case UN_RFILE: fprintf(stderr, "File read error: "); break;
case UN_WFILE: fprintf(stderr, "File write error: "); break;
}
vfprintf(stderr, format, stuff);
fprintf(stderr,"\n");
}
va_end(stuff);
}
|