home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Black Box 4
/
BlackBox.cdr
/
progc
/
c_all592.arj
/
TI730.ASC
< prev
next >
Wrap
Text File
|
1992-02-25
|
14KB
|
463 lines
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 1/7
TITLE : Example Source Code for TEMC Filter
/*
EXAMPLE SOURCE CODE FOR TEMC FILTER
TEMC2MSG.C
TEMC2Msg - output filter to Turbo C++ IDE message window
This filter accepts input through the standard input
stream, converts it and outputs it to the standard
output stream. The streams are linked through pipes,
such that the input stream is the output from the
assembler being invoked, and the output stream is
connected to the message window of the Turbo C++ IDE,
ie. temc fname configname | temc2msg | Turbo C++
message window
Compile using Turbo C++ in the LARGE memory model
tcc -ml temc2msg
*/
#include <dir.h>
#include <dos.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <alloc.h>
#include <io.h>
#include <ctype.h>
#include "filter.h"
#define TRUE (1 == 1)
#define FALSE !(TRUE)
/* Turbo TEMC text for conversion */
char TemcWarningTxt[] = "Warning ";
char TemcErrorTxt[] = "Error ";
char TemcFatalTxt[] = "Fatal ";
char CurFile[MAXPATH]; /* Current file in message
window */
unsigned BufSize, /* Size of internal working
buffer */
CurBufLen; /* Buffer space in use */
char *InBuffer, /* Input buffer */
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 2/7
TITLE : Example Source Code for TEMC Filter
*OutBuffer, /* Output buffer */
*CurInPtr, /* current character in input
buffer */
*CurOutPtr, /* current character in output*/
*LinePtr; /* pointer to the current
character in the input
buffer*/
int (*processor)(char *); /* function pointer used to call
the appropriate conversion
routine */
char Line[133]; /* static buffer to store line
most recently input */
long int InOff; /* position in actual input
stream */
char EndMark; /* Used to output end of data to
message
window */
/*************************************************************************
Function : NextChar
Parameters: none
Returns : next character in input buffer or 0 on end of file
Input from the standard input stream is buffered in a global
buffer InBuffer which is allocated in function main. The
function will return the next character in the buffer, reading
from the input stream when the buffer becomes empty.
**********************************************************************/
char NextChar(void)
{
if (CurInPtr < InBuffer+CurBufLen) /* if buffer is not empty*/
{
return *(CurInPtr++); /* return next character */
}
else
{
CurInPtr = InBuffer; /* reset pointer to front
of buffer */
lseek(0,InOff,0); /* seek to the next section
for read */
InOff += BufSize; /* increment pointer to
next block */
if ((CurBufLen = read(0,InBuffer,BufSize)) !=0)
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 3/7
TITLE : Example Source Code for TEMC Filter
return NextChar(); /* recursive call merely
returns first character
in buffer after read */
return 0; /* return 0 on end of
file*/
}
}
/*************************************************************************
Function : flushOut
Parameter : Size The number of characters to be written out
Returns : nothing
Strings to be sent to the message window are buffered in a buffer
called OutBuffer. A call to this function will write out Size
bytes from OutBuffer to the standard output stream and resets the
output buffer pointer to the beginning of the buffer. The output
buffer is considered empty after a call to this function.
***********************************************************************/
void flushOut(unsigned Size)
{
if (Size != 0) /* don't flush an empty buffer*/
{
CurOutPtr = OutBuffer; /* reset pointer to beginning of
buffer */
lseek(1,0,2); /* seek output stream to end */
write(1,OutBuffer,Size); /* write out Size bytes */
}
}
/************************************************************************
Function : Put
Parameters: S pointer to bytes being put into output buffer
Len number of bytes to be put in output buffer
Returns : nothing
Put places bytes into OutBuffer so they may be later flushed out
into the standard output stream.
***********************************************************************/
void Put(char *S,int Len)
{
int i;
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 4/7
TITLE : Example Source Code for TEMC Filter
for (i = 0; i < Len; i++)
{
*CurOutPtr++ = S[i]; /* place byte in buffer */
if (CurOutPtr >= OutBuffer+BufSize)/* if buffer overflows*/
flushOut(BufSize); /* flush the buffer */
}
}
/*************************************************************************
Function : ProcessLine
Parameters: Line a pointer to the current line of characters to
process
Returns : 1 if line is a Turbo Assembler line
0 if line is not
Process through a line of input to determine if it is a Turbo
Assembler output line and convert it to information for the Turbo
C++ message window.
Turbo Assembler lines which are in need of conversion are of the
form:
message-type source-file(LINE #) message-text
where type is one of: Warning, Error
TASM lines are identified by the first portion of text. If
warning, error or fatal is determined at the outset, text is
output from there as it is scanned. Any incorrect configuration
will simply abort the scanning of the rest of the line.
**********************************************************************/
int ProcessLine(char *Line)
{
char Type;
unsigned i;
char *s;
char fn[MAXPATH];
/* don't try to process a NULL line */
if (Line[0] == 0)
return 0;
/* check for temc type tags */
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 5/7
TITLE : Example Source Code for TEMC Filter
if (strncmp(Line,TemcWarningTxt,strlen(TemcWarningTxt))== 0)
memmove(Line,&Line[strlen(TemcWarningTxt)],strlen(Line));
else if (strncmp(Line,TemcErrorTxt,strlen(TemcErrorTxt))== 0)
memmove(Line,&Line[strlen(TemcErrorTxt)],strlen(Line));
else if (strncmp(Line,TemcFatalTxt,strlen(TemcFatalTxt))== 0)
memmove(Line,&Line[strlen(TemcFatalTxt)],strlen(Line));
else return 1; /* geen TEMC line */
s = strchr(Line,':'); /* find : */
if (s != NULL) /* if no :, invalid line */
{
while (*s != ' ')
s--;
memmove(fn,Line,(unsigned)(s-Line)); /*save filename*/
fn[(unsigned)(s-Line)] = 0; /* null terminate name */
memmove(Line,++s,strlen(Line)); /* shift line left */
if (strcmp(fn,CurFile) != 0) /* if new filename */
{
Type = MsgNewFile; /* indicate by sending type
out to message window */
strcpy(CurFile,fn);
Put(&Type,1);
Put(CurFile,strlen(CurFile)+1); /*
along with the new name */
}
Type = MsgNewLine; /* set type to new line */
s = strchr(Line,':'); /* find : */
*s = 0; /* isolate number in string */
i = atoi(Line); /* if number is found convert string
to integer */
if (i != 0)
{
Put(&Type,1); /* indicate need for new line */
Put((char *)&i,2); /* put the number out */
i = 1; /* set column in message box */
Put((char *)&i,2); /* tab over to put message */
s++;
memmove(Line,s,strlen(s)+1); /* shift line */
while (Line[0] == ' ' && Line[0] != 0) /* strip
spaces from line */
memmove(Line,&Line[1],strlen(Line));
Put(Line,strlen(Line)+1); /*output the message */
return 0; /* OK Temc line */
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 6/7
TITLE : Example Source Code for TEMC Filter
}
return 1; /* invalid line number, not TASM line */
}
else /* Fatal error, no line # or filename */
{
Type = MsgNewLine; /* Fake line # etc.*/
i = 1;
Put(&Type,1);
Put((char *)&i,2);
Put((char *)&i,2);
while (Line[0] == ' ' && Line[0] != 0)
memmove(Line,&Line[1],strlen(Line));
Put(Line,strlen(Line)+1);
return 0;
}
}
/***********************************************************************
Function : main
Returns : zero for successful execution
3 if an error is encountered
The main routine allocates buffers for the input and output
buffer. Characters are then read from the input buffer building
the line buffer that will be sent to the filter processor. Lines
are read and filtered until the end of input is reached.
***********************************************************************/
int main( void )
{
char c;
unsigned long core;
setmode(1,O_BINARY); /* set output stream to binary mode */
core = farcoreleft();
if (core > 64000U)
BufSize = 64000U;
else BufSize = (unsigned)core; /* get available memory */
/* stay under 64K */
if ((CurInPtr = malloc(BufSize)) == NULL) /* allocate buffer
space */
exit(3);
PRODUCT : Borland C++ NUMBER : 730
VERSION : 2.0
OS : DOS
DATE : February 25, 1992 PAGE : 7/7
TITLE : Example Source Code for TEMC Filter
processor = NULL; /* set current processor to
none */
InBuffer = CurInPtr; /* input buffer is first
half of space */
BufSize = BufSize/2; /* output buffer is 2nd
half */
OutBuffer = InBuffer + BufSize;
CurOutPtr = OutBuffer; /* set buffer pointers */
LinePtr = Line;
CurBufLen = 0;
Put(PipeId,PipeIdLen); /* send ID string to
message window */
while ((c = NextChar()) != 0) /* read characters */
{
if ((c == 13) || (c == 10)) /* build until line end */
{
*LinePtr = 0;
ProcessLine(Line); /* filter the line */
LinePtr = Line;
}
/* characters are added to buffer up to 132 characters max */
else if ((FP_OFF(LinePtr) - FP_OFF(&Line)) < 132)
{
*LinePtr = c; /* add to line buffer */
LinePtr++;
}
}
*LinePtr = 0;
ProcessLine(Line); /* filter last line */
EndMark = MsgEoFile;
Put(&EndMark,1); /* indicate end of input to
the message window */
flushOut((unsigned)(CurOutPtr-OutBuffer)); /*flush the
buffer*/
return 0; /* return OK */
}