lint2msg.c
上传用户:filter2008
上传日期:2010-03-12
资源大小:2959k
文件大小:10k
源码类别:

编辑器/阅读器

开发平台:

C/C++

  1. /*
  2.    EXAMPLE SOURCE CODE FOR GREP FILTER
  3.    Grep2Msg.C
  4.    Copyright (c) 1990, 1991 Borland International, Inc.
  5.    All rights reserved.
  6.    Grep2Msg - Message filter from Turbo Grep to Turbo C++ IDE message window
  7.    This filter accepts input through the standard input stream, converts
  8.    it and outputs it to the standard output stream.  The streams are linked
  9.    through pipes, such that the input stream is the output from GREP, and
  10.    the output stream is connected to the message window of the Turbo C++ IDE.
  11.    This filter is invoked through the Turbo C++ IDE transfer mechanism as
  12.             grep <commands> | grep2msg | TC IDE
  13.     Compile using Turbo C++ in the LARGE memory model
  14.     tcc -ml grep2msg
  15. */
  16. #include <dir.h>
  17. #include <stdlib.h>
  18. #include <fcntl.h>
  19. #include <string.h>
  20. #include <alloc.h>
  21. #include <io.h>
  22. #include <dos.h>
  23. #include <stdio.h>
  24. #include "filter.h"
  25. #define TRUE  1
  26. #define FALSE 0
  27. #define STR_MAX  256
  28. #define NAME_MAX 80
  29. char     NewFileText[] = "--- Module:   ";
  30. char     IncludeText[] = "Including file ";
  31. unsigned BufSize,CurBufLen;
  32. char     *InBuffer,
  33.  *OutBuffer,
  34.  *CurInPtr,
  35.  *CurOutPtr,
  36.  *LinePtr;
  37. char     Line[133];
  38. long int InOff;
  39. char     EndMark;
  40. int      NoLines;
  41. char     oldfile[NAME_MAX] = "";
  42. int      replace = 0;
  43. /************************************************************************
  44. Function  : NextChar
  45. Parameters: None
  46. Returns   : next character in input buffer or 0 for end of file
  47. Input from the standard input stream is buffered in a global buffer InBuffer
  48. which is allocated in function main.  NextChar function will return
  49. the next character in the buffer, reading from the input stream when the
  50. buffer becomes empty.
  51. ************************************************************************/
  52. char NextChar(void)
  53. {
  54.    if (CurInPtr < InBuffer+CurBufLen)   /* if buffer is not empty */
  55.    {
  56.       return *(CurInPtr++);             /* return next information */
  57.    }
  58.    else
  59.    {
  60.       CurInPtr = InBuffer;              /* reset pointer to front of buffer */
  61.       lseek(0,InOff,0);                 /* seek to the next section for read */
  62.       InOff += BufSize;                 /* increment pointer to next block */
  63.       if ((CurBufLen = (unsigned) read(0,InBuffer,BufSize)) !=0)
  64.  if (CurInPtr < InBuffer+CurBufLen)
  65.      return *(CurInPtr++);
  66.       return 0;                         /* return 0 on end of file */
  67.    }
  68. }
  69. /*************************************************************************
  70. Function  : flushOut
  71. Parameters: Size   The number of characters to be written out
  72. Returns   : nothing
  73. Strings to be sent to the message window are placed in a buffer called
  74. OutBuffer.  A call to this function will write Size bytes to the
  75. standard output stream and reset the output buffer pointer to the
  76. beginning of the buffer.  Any additional information in the buffer is
  77. thus lost.
  78. **************************************************************************/
  79. void flushOut(unsigned Size)
  80. {
  81.   if (Size != 0)                 /* don't flush an empty buffer */
  82.   {
  83.     CurOutPtr = OutBuffer;       /* reset pointer to beginning of buffer */
  84.     lseek(1,0L,2);                /* seek output stream to end */
  85.     write(1,OutBuffer,Size);     /* write out Size bytes */
  86.   }
  87. }
  88. /**************************************************************************
  89. Function  : Put
  90. Parameters: S     pointer to a string of characters
  91.     Len   length of the string of characters
  92. Returns   : Nothing.
  93. Put places bytes into OutBuffer so they may be later flushed out into the
  94. standard output stream using flushOut.
  95. If global variable 'replace' is set, any ':' in the string is replaced by
  96.     a '|' because otherwise the IDE gets confused.
  97. *************************************************************************/
  98. void Put(char *S,int Len)
  99. {
  100.   int i;
  101.   for (i = 0; i < Len; i++)
  102.   {
  103.     if( replace )
  104. *CurOutPtr++ = (S[i] == ':') ? '|' : S[i]; /* place byte in buffer */
  105.     else
  106. *CurOutPtr++  = S[i];
  107.     if (CurOutPtr >= OutBuffer+BufSize)      /* if buffer overflows */
  108.       flushOut(BufSize);                     /* flush to the stream */
  109.   }
  110. }
  111. /* parseline() will use strtok() to break up a line
  112.  */
  113. void parseline( const char *line, unsigned int *lno, unsigned int *col,
  114. char *filename, char *msg )
  115.    {
  116.    char temp[STR_MAX], *tmpptr, *t2;
  117.    int num = 0;
  118.    strcpy( temp, line );
  119.    tmpptr = temp;
  120.    t2 = strtok( tmpptr, " " );
  121.    num += strlen( t2 ) + 1;
  122.    *lno = (unsigned int) atoi( t2 );
  123.    t2 = strtok( (char *) NULL, " " );
  124.    num += strlen( t2 ) + 1;
  125.    *col = (unsigned int) atoi( t2 );
  126.    strcpy( filename, strtok( (char *) NULL, " " ) );
  127.    num += strlen( filename ) + 1;
  128.    strcpy( msg, line + num );
  129.    }
  130. /* newfile_block() will write out the information needed to declare a new
  131.    file
  132.  */
  133. void newfile_block( char *filename )
  134.     {
  135.     char temp;
  136.     temp = (char) MsgNewFile;  /* new file block */
  137.     Put( &temp, 1 );
  138.     Put( filename, strlen( filename ) + 1 );
  139.     strcpy( oldfile, filename );
  140.     NoLines = TRUE;
  141.     }
  142. /* newmesg_block() will write out the information for a new message
  143.  */
  144. void newmesg_block( char *msg, int lno, int col )
  145.     {
  146.     char temp;
  147.     temp = (char) MsgNewLine;  /* new line block */
  148.     Put( &temp, 1 );
  149.     Put( (char *) &lno, 2 );
  150.     Put( (char *) &col, 2 );
  151.     replace = 1;
  152.     Put( msg, strlen( msg ) + 1 );
  153.     replace = 0;
  154.     }
  155. /**************************************************************************
  156. Function  : ProcessLine
  157. Parameters: Line   a pointer to the character line to be analyzed
  158. Returns   : Nothing.
  159. Filters lines output from grep into a format usable in the Turbo C++
  160. environment message window.  Lines are simply sent straight through
  161. with format characters for the message window.
  162. **************************************************************************/
  163. void ProcessLine( char *Line )
  164. {
  165.   unsigned i;
  166.   unsigned col;
  167.   unsigned lno;
  168.   char msg[255];
  169.   char filename[80];
  170.   if( !Line || Line[0] == 0 )
  171.       return;
  172.   /* check for formatted output line */
  173.   if( (Line[0] >= '0') && (Line[0] <= '9') )
  174.       {
  175.       NoLines = FALSE;
  176.       parseline( Line, &lno, &col, filename, msg );
  177.       col++;
  178.       if( strncmp( filename, oldfile, NAME_MAX ) != 0 )
  179.   {
  180.   newfile_block( filename );
  181.   NoLines = TRUE;
  182.   }
  183.       newmesg_block( msg, lno, col );
  184.       }
  185.    else
  186.       {
  187.       /* check for new module */
  188.       if( strncmp( Line, NewFileText, strlen(NewFileText) ) == 0 )
  189.   {
  190.   memmove( filename, &Line[strlen( NewFileText )],
  191.    strlen( Line ) - strlen( NewFileText ) + 1 );
  192.   for( i = strlen(filename) - 1; filename[i] == ' ';
  193.        filename[i--] = '')
  194.       ;
  195.   newfile_block( filename );
  196.   NoLines = TRUE;
  197.   newmesg_block( Line, 1, 1 );
  198.   }
  199.       else
  200.   {
  201.   /* check for included file */
  202.   if( strncmp( Line, IncludeText, strlen( IncludeText ) ) == 0 )
  203.       {
  204.       memmove( msg, &Line[strlen( IncludeText )],
  205.        strlen( Line ) - strlen( IncludeText ) + 1 );
  206.       sscanf(msg, "%[^ (n]", filename);
  207.       newfile_block( filename );
  208.       newmesg_block( msg, 1, 1 );
  209.       }
  210.   else
  211.       newmesg_block( msg, 1, 1 );
  212.   }
  213.       }
  214.   }
  215. /************************************************************************
  216. Function  : Main
  217. Returns   : zero on successful execution
  218.        3 on an error condition
  219. The main routine allocates memory for the input and output buffers.
  220. Characters are then read from the input buffer building the line buffer
  221. that will be sent to the filter processor.  Lines are read and filtered
  222. until the end of input is reached.
  223. ************************************************************************/
  224. int main(void)
  225. {
  226.    char c;
  227.    char MType;
  228.    unsigned long core;
  229.    unsigned lnum = 0;
  230.    (void) setmode(1,O_BINARY);        /* set standard out to binary mode */
  231.    NoLines = FALSE;                   /* No lines have been read yet */
  232.    core = farcoreleft();              /* get available memory */
  233.    if (core > 64000U)                 /* limit buffers to total of 64000 */
  234.       BufSize = 64000U;               /* bytes */
  235.    else
  236.       BufSize = (unsigned)core;
  237.    if ((InBuffer = (char *)  malloc(BufSize)) == NULL) /* allocate buffer space */
  238.       exit(3);                        /* abort if error occured */
  239.    CurInPtr = InBuffer;               /* split buffer */
  240.    BufSize = BufSize/2;               /* between input and output buffers */
  241.    OutBuffer = InBuffer + BufSize;
  242.    CurOutPtr = OutBuffer;
  243.    LinePtr = Line;                    /* set line buffer pointer */
  244.    CurBufLen = 0;                     /* and reset buffer size to zero */
  245.    Put(PipeId,PipeIdLen);             /* Identify process to message window */
  246.    MType = (char) MsgNewFile;         /* indicate new file */
  247.    Put( &MType, 1 );
  248.    Put( " ", 2 );                     /* kill default filename */
  249.    MType = (char) MsgNewLine;
  250.    while ((c = NextChar()) != 0)      /* read characters */
  251.    {
  252.       if ((c == 13) || (c == 10))     /* build line until new line is seen */
  253.       {
  254.  lnum++;
  255.  *LinePtr = 0;
  256.  if( lnum > 1 )
  257.      ProcessLine(Line);           /* then filter the line */
  258.  LinePtr = Line;
  259.       }
  260.       /* characters are added to line only up to 132 characters */
  261.       else if ((FP_OFF(LinePtr) - FP_OFF(&Line)) < 132)
  262.       {
  263.  *LinePtr = c;
  264.  LinePtr++;
  265.       }
  266.    }
  267.    *LinePtr = 0;
  268.    ProcessLine( Line );                  /* filter last line */
  269.    if( NoLines )
  270.        newmesg_block( " ", 1, 1 );
  271.    EndMark = (char) MsgEoFile;           /* indicate end of input to */
  272.    Put(&EndMark,1);                      /* message window */
  273.    flushOut((unsigned)(CurOutPtr-OutBuffer));  /* flush out remaining buffer */
  274.    return  0;                          /* everything went ok */
  275. }