home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / WIN_NT / MSED.ZIP / MS_SSED / MSGSTAT.C < prev   
Encoding:
C/C++ Source or Header  |  1992-07-22  |  8.0 KB  |  372 lines

  1. extern void found( int , char *);
  2. #define TCHAR char
  3. #define LEN 256
  4.  
  5. #include <stdio.h>
  6. #include <ctype.h>
  7. #include <malloc.h>
  8. #include <string.h>
  9. #include <assert.h>
  10. #include "myopt.h"
  11. #define TRUE 1
  12. #define FALSE 0
  13.  
  14. #define MAX_NUMBER 100
  15. #define MAX_PARMS    8
  16.  
  17. #define max(a,b) (((a) > (b)) ? (a) : (b))
  18.  
  19. struct _apitype {
  20.     char *pchName;
  21.     char *pchformat;
  22.     int   cb;
  23.     int   cParms;
  24.     int   iOrder[MAX_PARMS];
  25. } apilist[MAX_NUMBER];
  26. int api_num = -1;
  27.  
  28.  
  29. FILE *fp_src, *fp_dst, *fp_err, *fp_dat;
  30. char chFirstBuf[53];
  31. int token_length = 0;
  32. int bVerbose = FALSE;
  33. int  bBinary  = FALSE;
  34.  
  35. #define m_iswspace(a) (isspace(a) && (a) != '\n')
  36.  
  37. char *get_token( char *pch)
  38. {
  39.     char *pch2;
  40.  
  41.     while (*pch)
  42.         {
  43.         if (isalnum(*pch))
  44.             {
  45.             if (strchr( chFirstBuf, *pch))
  46.                 {
  47.                 pch2 = pch;
  48.                 while(isalnum(*pch2)) pch2++;
  49.                 token_length = (int)(pch2 - pch);
  50.                 return(pch);
  51.                 }
  52.             do
  53.                 {
  54.                 pch++;
  55.                 } while(isalnum(*pch));
  56.             }
  57.         while (*pch && !isalnum(*pch))
  58.             {
  59.             pch++;
  60.             } 
  61.         }
  62.     return(NULL);
  63. }
  64.  
  65. char ch1[50] = "WinSendMsg";
  66. char ch2[50] = "S %s\n";
  67. char ch3[50] = "WinPostMsg";
  68. char ch4[50] = "P %s\n";
  69. char ch5[50] = "WinSendDlgItemMsg";
  70. char ch6[50] = "D %s\n";
  71.  
  72. void init_dat(int bDump)
  73. {
  74.     int ii, jj;
  75.  
  76.     api_num = 3;
  77.  
  78.     strcpy(chFirstBuf, "W");
  79.  
  80.     for (ii = 0; ii < api_num; ii++)
  81.         for (jj = 0; jj < MAX_PARMS; jj++)
  82.             apilist[ii].iOrder[jj] = -1;
  83.  
  84.     apilist[0].pchName = ch1;
  85.     apilist[0].cb      = 10;
  86.     apilist[0].cParms  =  4;
  87.     apilist[0].pchformat = ch2;
  88.     apilist[0].iOrder[0] = 1;
  89.  
  90.     apilist[1].pchName = ch3;
  91.     apilist[1].cb      = 10;
  92.     apilist[1].cParms  =  4;
  93.     apilist[1].pchformat = ch4;
  94.     apilist[1].iOrder[0] = 1;
  95.  
  96.     apilist[2].pchName = ch5;
  97.     apilist[2].cb      = 17;
  98.     apilist[2].cParms  =  5;
  99.     apilist[2].pchformat = ch6;
  100.     apilist[2].iOrder[0] = 2;
  101.  
  102. }
  103.  
  104.  
  105.  
  106. void add_buff(char *pch)
  107. {
  108.     char chExtraLine[256];
  109.     fgets( chExtraLine, 256, fp_src);
  110.     if (bVerbose)
  111.         fputs( chExtraLine, fp_err);
  112.  
  113.     strcat( pch, chExtraLine);
  114. }
  115.  
  116. void found( int index, char *pch)
  117. {
  118.     char chApiBuf[2048];
  119.     char chRestBuf[256];
  120.     char *pchIn = pch;
  121.     char *pchOut = chApiBuf;
  122.     char *pchEnd;
  123.     char pchParms[MAX_PARMS][256];
  124.     char *parmlist[MAX_PARMS];
  125.     struct _apitype *api = &apilist[index];
  126.     int nest = 0;
  127.     int iParmNo = 0;
  128.     int string = 0;
  129.     int ii;
  130.     char ch;
  131.  
  132.     for (ii = 0; ii < MAX_PARMS; ii++)
  133.         {
  134.         pchParms[ii][0] = 0x00;
  135.         parmlist[ii]    = NULL;
  136.         }
  137.  
  138.     strncpy( chApiBuf, pch, api->cb);
  139.     pchIn += api->cb;
  140.     pchOut = chApiBuf + api->cb;
  141.     while (iswspace(*pchIn)) pchIn++;
  142.     assert( *pchIn == '(');
  143.    *pchOut++ = *pchIn++;
  144.     nest = 1;
  145.  
  146.     while (nest > 0)
  147.         {
  148.         ch = *pchOut++ = *pchIn++;
  149.         if (ch == '(') nest++;
  150.         if (ch == ')') nest--;
  151.         if (ch == '\'' || ch == '\"')
  152.             {
  153.             char chEnd = ch;
  154.  
  155.             do
  156.                 {
  157.                 ch = *pchOut++ = *pchIn++;
  158.                 if (ch == '\\')
  159.                     ch = *pchOut++ = *pchIn++;
  160.                 if (ch == 0x00)
  161.                     {
  162.                     pchIn--;
  163.                     pchOut--;
  164.                     add_buff(pchIn);
  165.                     }
  166.                 }
  167.             while (ch != chEnd);
  168.             }
  169.         if (ch == 0x00)
  170.             {
  171.             pchIn--;
  172.             pchOut--;
  173.             add_buff(pchIn);
  174.             }
  175.         }
  176.  
  177.     *pchOut = 0x00;
  178.     strcpy( chRestBuf, pchIn);
  179.     pchIn = chApiBuf + api->cb + 1;
  180. //    printf( "Api (%s) Rest (%s)\n", chApiBuf, chRestBuf);
  181.     if (api->pchformat == NULL)
  182.         {
  183.         strcpy( pch, chRestBuf);
  184.         return;
  185.         }
  186.  
  187.     nest = 1;
  188.     iParmNo = 0;
  189.     pchEnd = pchIn;
  190.  
  191.     while (nest > 0)
  192.         {
  193.         int  cb;
  194.         char *pchBeginLoop = pchEnd;
  195.  
  196.         ch = *pchEnd;
  197.         while (isspace(ch) || isalnum(ch)
  198.             || strchr("&*.[]-></+|?!%=^_:", ch) ) ch = *++pchEnd;
  199.  
  200.         if ( ! (strchr("\"\'(),", ch)))
  201.             printf("Invalid character %c\n", ch);
  202.  
  203.         assert( ch != 0x00);
  204.  
  205.         if (ch == '\"' || ch == '\'')
  206.             {
  207.             char chEnd = ch;
  208.             do
  209.                 {
  210.                 ch = *++pchEnd;
  211.                 if (ch == '\\')
  212.                     ch = *++pchEnd;
  213.                 }
  214.             while (ch != chEnd);
  215.             ch = *++pchEnd;
  216.             }
  217.         if (ch == '(') 
  218.             {
  219.             nest++;
  220.             ++pchEnd;
  221.             }
  222.         if (ch == ')') 
  223.             {
  224.             nest--;
  225.             if (nest == 0)
  226.                 {
  227.                 cb = pchEnd - pchIn;
  228.                 strncpy(pchParms[iParmNo], pchIn, cb);
  229.                 pchParms[iParmNo++][cb] = 0x00;
  230.                 pchIn += cb + 1;
  231.                 pchEnd = pchIn;
  232.                 }
  233.             else
  234.                 ++pchEnd;
  235.             }
  236.         if (ch == ',' )
  237.             {
  238.             if (nest == 1)
  239.                 {
  240.                 cb = pchEnd - pchIn;
  241.                 strncpy(pchParms[iParmNo], pchIn, cb);
  242.                 pchParms[iParmNo++][cb] = 0x00;
  243.                 pchIn += cb + 1;
  244.                 pchEnd = pchIn;
  245.                 }
  246.             else
  247.                 ++pchEnd;
  248.             }
  249.         if(pchBeginLoop == pchEnd)
  250.             pchEnd++;
  251.         }
  252.  
  253.     for (ii = 0; ii < MAX_PARMS; ii++)
  254.         {
  255.         if (api->iOrder[ii] != -1)
  256.             parmlist[ii] = pchParms[api->iOrder[ii]];
  257.         else
  258.             parmlist[ii] = NULL;
  259.         }
  260.  
  261.     sprintf( pch, api->pchformat, parmlist[0], parmlist[1],
  262.         parmlist[2], parmlist[3], parmlist[4], parmlist[5],
  263.         parmlist[6], parmlist[7]);
  264.  
  265.     fputs( pch, fp_dst);
  266.     strcat(pch, chRestBuf);
  267.  
  268. }
  269.  
  270. char *FindApi( char *pch)
  271. {
  272.     int ii;
  273.     char *ptr;
  274.  
  275.     for (ii = 0; ii < api_num; ii++)
  276.         {
  277.         if ( token_length == apilist[ii].cb &&
  278.                 *pch == apilist[ii].pchName[0] &&
  279.                 (strncmp( pch, apilist[ii].pchName, apilist[ii].cb) == 0))
  280.             {
  281.             ptr = pch + apilist[ii].cb;
  282.             while (iswspace(*ptr)) ptr++;
  283.             if (*ptr == '(')
  284.                 {
  285.                 found(ii, pch);
  286.                 return( pch + 1);
  287.                 }
  288.             }
  289.         }
  290.  
  291.     return( pch + 1);
  292. }
  293.  
  294. void useage()
  295. {
  296.     printf( "Useage: msgstat file \n");
  297. }
  298.  
  299. main( argc, argv)
  300.     int argc;
  301.     char *argv[];
  302.     {
  303.     int ii;
  304.     char src[30];
  305.     char dst[30];
  306.     char buffer[2560];
  307.     char *ptr;
  308.     int  bDump = FALSE;
  309.     char chDataFile[34] = "define.dat";
  310.     char chBinFile[34] = "ms_ssed.bin";
  311.     char *pchDataFile = chDataFile;
  312.     char *pchBinFile = chBinFile;
  313.  
  314.     int  bCompile = FALSE;
  315.  
  316.     ii = 1;
  317.  
  318.     src[0] = 0x00;
  319.     dst[0] = 0x00;
  320.  
  321.     while (ii = my_getopt(argc, argv, ""))
  322.         {
  323.         switch (ii)
  324.             {
  325.             case -1:
  326.                 if (src[0] == 0x00)
  327.                     {
  328.                     strcpy(src, p_optstr);
  329.                     break;
  330.                     }
  331.  
  332.                 // FALL THRU
  333.  
  334.             default:
  335.                 useage();
  336.                 return(0);
  337.             }
  338.         }
  339.     
  340.     if (src[0] == 0x00 )
  341.         {
  342.         useage();
  343.         return(0);
  344.         }
  345.  
  346.     fp_src = stdin;
  347.     fp_dst = stdout;
  348.     fp_err = stderr;
  349.  
  350.     fp_src = freopen( src, "rt", stdin);
  351.  
  352.     if (fp_src == NULL)
  353.         {
  354.         printf( "Could not open %s\n", src);
  355.         return(0);
  356.         }
  357.  
  358.     init_dat(FALSE);
  359.  
  360.     while (fgets( buffer, 256, fp_src))
  361.         {
  362.         ptr = buffer;
  363.         while (ptr = get_token( ptr))
  364.             {
  365.             ptr = FindApi(ptr);
  366.             }
  367.         }
  368.     fclose(fp_src);
  369.     fclose(fp_dst);
  370.     }
  371.  
  372.