📄 spoolint.c
字号:
/* SCCSID @(#)spoolint.c 1.15 5/28/97 */#if defined(VCW)||defined(VCWSPOOL1)||defined(VCWSPOOL2)/*************************************************************/ #include "common.h"#include <stdarg.h>#include <stdio.h>#include <string.h>#include <memory.h>#include "spoolint.h"#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif/* lib replace */ #ifndef EMULATOR#define POOLBUFFLENGTH 66 #define mon_put_long mon_put_long0 #else#define POOLBUFFLENGTH 24 #define mon_put_long mon_put_long1#endif#define SPOOLSTRING 0x00#define SPOOLBLOCK 0x01#define SPOOLCHAR 0x02#define SPOOLBYTE 0x03#define SPOOLINT 0x04#define SPOOLWORD 0x05#define SPOOLLONG 0x06#define SPOOLDWORD 0x07#define SPOOLKEYVAR 0x08#define KEYVARHEADFORMAT 0xff080208lstatic unsigned int pool_buff[POOLBUFFLENGTH], *pool_buff_last = pool_buff+POOLBUFFLENGTH;static unsigned int *read_ptr = pool_buff, *write_ptr = pool_buff;int spoolint_job_number = 0 ;#define pool_clear() ( read_ptr = write_ptr = pool_buff, spoolint_job_number=0 )#define pool_free_size(x, p) { x = read_ptr - p; if (x<=0) x+=POOLBUFFLENGTH; }#define ptr_round(x) { if (x >= pool_buff_last) x -= POOLBUFFLENGTH ; } #define ptr_increase(x, y) { x += y; if (x >= pool_buff_last) x -= POOLBUFFLENGTH; } #if defined(VCW)void spoolhandler(void){ register unsigned int *p = read_ptr; /* send data out */ mon_put_long(*p); mon_put_long(*(p+1)); mon_put_long(*(p+2)); ptr_increase(p, 3); read_ptr = p; /* printing job decease */ spoolint_job_number --;} int spoolkeyvar(int *ptr){ register unsigned int *p = write_ptr; register int free_size; /* get free size and size check*/ pool_free_size(free_size, p); if ( free_size <= 3 ) return -1; /* send data to pool */ *p = KEYVARHEADFORMAT; *(p+1) = (unsigned int)ptr; *(p+2) = *ptr; ptr_increase(p, 3); write_ptr = p ; /* printing job incease */ spoolint_job_number ++; return 8;}#elif defined(VCWSPOOL1)||defined(VCWSPOOL2)#define HEADFORMAT_MASK 0xff000000l #define DATALENGTH_MASK 0x00ff0000l#define WINNUM_MASK 0x0000ff00l#define DATATYPE_MASK 0x000000ffl#define headformatcheck(format) ((HEADFORMAT_MASK==(HEADFORMAT_MASK&(format)))?TRUE:FALSE)#define get_datatype(format) ( DATATYPE_MASK & format)#define get_winnum(format) ((WINNUM_MASK & (format)) >> 8 )#define get_datalength(format) ((DATALENGTH_MASK & (format)) >> 16 )void spoolhandler(void){ register unsigned int *p = read_ptr; register int i, datanumber; /* get headformat and check it if correct*//* headformat = *read_ptr; if (!headformatcheck) { mon_put_long(0x5c5c5c5cl); pool_clear(); return; }*/ /* get data length */ i = get_datalength(*p); datanumber = (i>>2) + ((i&0x3)!=0); /* data out */ for (i=0; i<datanumber+1; i++) { mon_put_long(*p++); ptr_round(p); } read_ptr = p ; /* printing job decease */ spoolint_job_number --;} int spoolkeyvar(int *ptr){ register unsigned int *p = write_ptr, *p1 = pool_buff; register int i; /* get free size and spool space detect*/ pool_free_size(i, p); if ( i <= 3 ) return -1; /* send data to pool */ *p = KEYVARHEADFORMAT; i = p1 - p + POOLBUFFLENGTH; switch (i) { case 1: *p1 = (unsigned int)ptr; *(p1+1) = *ptr; p = p1 + 2; break; case 2: *(p+1) = (unsigned int)ptr; *p1 = *ptr; p = p1 + 1; break; default: *(p+1) = (unsigned int)ptr; *(p+2) = *ptr; ptr_increase(p, 3); } write_ptr = p; /* printing job incease */ spoolint_job_number ++; return 8;}int spoolstring(int winnum, char *string){ register unsigned int *p = write_ptr; register unsigned int k = 0xff000000; register int i, j, datanumber; /* set head format */ i = strlen ( string ); datanumber = (i>>2) + ((i&0x3)!=0); /* get free size and check space size*/ pool_free_size(j, p); if ( j <= datanumber + 1 ) return -1; /* set head format and get data*/ i <<= 16; winnum <<= 8; k |= i + (winnum&0xff00); /* send data to pool */ *p++ = k; ptr_round(p); for (i=0; i<datanumber; i++) { k = *string++; for (j=0; j<3; j++) { k <<= 8; k |= *string++; } *p++ = k; ptr_round(p); } write_ptr = p; /* printing job incease */ spoolint_job_number ++; return datanumber;} int spoolout(int winnum, int type, ...){ register unsigned int *p = write_ptr; register unsigned int k = 0xff040000; register int i; va_list args; /* get free size and free space check*/ pool_free_size(i, p); if ( i <= 2 ) return -1; /* set head format and send out */ winnum <<= 8; k |= (winnum & 0xff00) | (type&0xff); *p++ = k; ptr_round(p); /* get data by type and send out */ va_start(args, type); if (type == SPOOLCHAR) k = va_arg(args, char); else k = (unsigned int) va_arg(args, int); *p++ = k; ptr_round(p); write_ptr = p; /* printing job incease */ spoolint_job_number ++; return 4 ;}#if defined(VCWSPOOL2)int spoolprintf(int winnum, const char * format, ...){ char pool_buff1[POOLBUFFLENGTH]; int datalength; va_list args; /* data format transferomation */ va_start(args, format); datalength = vsprintf(pool_buff1, format, args); /* call spoolinstring */ if ( datalength > 0 ) datalength = spoolstring(winnum, pool_buff1); return datalength ;} #endif#endif #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -