GCCXML初始用

上面生成的gccxml.exe就是我们用来解析源码文件的工具,当然这玩意不能单独使用,他只是一个补丁,他得依附在编译器上,所以你得保证你的电脑上安装了编译器。下面是GCCXML支持的几个编译器(有点奇怪的是我电脑上其实只有vs2010,但也成功了,虽然下面没有列出来后来经过测试发现确实用的是08的,可能之前没有卸载干净,可以通过get_gccxml_compiler()来获取当前的版本):

·            GCC: Versions 4.2,4.1, 4.0, 3.4, 3.3, 3.2, 2.95.x

·            VisualC++: Versions 8, 7.1, 7.0, and 6 (sp5)

·            Borland,Intel, SGI: formerly supported but no longer tested

他的命令行格式是这样的:gccxml[options] -fxml=

具体的选项可以参考http://gccxml.github.io/HTML/Running.html,这里我只用了最简单的格式。

这里用来测试的文件是取自SWMM引擎的hash.c代码如下:


//-----------------------------------------------------------------------------
//   hash.c
//
//   Implementation of a simple Hash Table for string storage & retrieval
//   CASE INSENSITIVE
//
//   Written by L. Rossman
//   Last Updated on 6/19/03
//
//   The hash table data structure (HTable) is defined in "hash.h".
//   Interface Functions:
//      HTcreate() - creates a hash table
//      HTinsert() - inserts a string & its index value into a hash table
//      HTfind()   - retrieves the index value of a string from a table
//      HTfree()   - frees a hash table
//-----------------------------------------------------------------------------

#include 
#include 
#include "hash.h"
#define UCHAR(x) (((x) >= 'a' && (x) <= 'z') ? ((x)&~32) : (x))

/* Case-insensitive comparison of strings s1 and s2 */
int  samestr(char *s1, char *s2)
{
   int i;
   for (i=0; UCHAR(s1[i]) == UCHAR(s2[i]); i++)
     if (!s1[i+1] && !s2[i+1]) return(1);
   return(0);
}                                       /*  End of samestr  */

/* Use Fletcher's checksum to compute 2-byte hash of string */
unsigned int hash(char *str)
{
    unsigned int sum1= 0, check1;
    unsigned long sum2= 0L;
	while(  '\0' != *str  )
    {
        sum1 += UCHAR(*str);
        str++;
        if (  255 <= sum1  ) sum1 -= 255;
        sum2 += sum1;
    }
    check1= sum2;
    check1 %= 255;
    check1= 255 - (sum1+check1) % 255;
    sum1= 255 - (sum1+check1) % 255;
    return( ( ( check1 << 8 )  |  sum1  ) % HTMAXSIZE);
}

HTtable *HTcreate()
{
        int i;
        HTtable *ht = (HTtable *) calloc(HTMAXSIZE, sizeof(HTtable));
        if (ht != NULL) for (i=0; i= HTMAXSIZE ) return(0);
        entry = (struct HTentry *) malloc(sizeof(struct HTentry));
        if (entry == NULL) return(0);
        entry->key = key;
        entry->data = data;
        entry->next = ht[i];
        ht[i] = entry;
        return(1);
}

int     HTfind(HTtable *ht, char *key)
{
        unsigned int i = hash(key);
        struct HTentry *entry;
        if ( i >= HTMAXSIZE ) return(NOTFOUND);
        entry = ht[i];
        while (entry != NULL)
        {
            if ( samestr(entry->key,key) ) return(entry->data);
            entry = entry->next;
        }
        return(NOTFOUND);
}

char    *HTfindKey(HTtable *ht, char *key)
{
        unsigned int i = hash(key);
        struct HTentry *entry;
        if ( i >= HTMAXSIZE ) return(NULL);
        entry = ht[i];
        while (entry != NULL)
        {
            if ( samestr(entry->key,key) ) return(entry->key);
            entry = entry->next;
        }
        return(NULL);
}

void    HTfree(HTtable *ht)
{
        struct HTentry *entry,
                       *nextentry;
        int i;
        for (i=0; inext;
                free(entry);
                entry = nextentry;
            }
        }
        free(ht);
}


当然你要保证你的代码和文件路径(这里的文件路径包含引用的头文件)是没有问题的,不然编译器会检测出问题,而导致失败。

 

然后通过执行

GCCXML初始用_第1张图片

就可以看到在D盘下生成了hash.xml文件。具体文件如下:



  
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
  
  
    
    
  
  
    
  
  
  
  
    
    
    
  
  
    
    
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
  
    
  
  
  
  
    
    
  
  
    
    
    
    
  
  
  
  
    
    
    
  
  
    
    
    
    
  
  
  
    
    
  
  
  
  
    
    
    
  
  
    
    
    
  
  
    
  
  
  
  
    
    
    
  
  
    
    
    
    
  
  
  
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
    
  
  
    
    
    
  
  
  
  
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
    
  
  
  
    
    
    
  
  
  
  
  
  
    
    
  
  
    
    
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
  
  
  
  
  
    
    
    
  
  
    
    
    
  
  
  
    
    
    
  
  
  
    
  
  
    
    
    
  
  
    
    
    
  
  
    
  
  
  
    
    
    
  
  
    
    
  
  
  
  
    
    
    
    
  
  
    
    
  
  
    
  
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
  
    
    
    
    
  
  
  
    
  
  
    
  
  
    
    
  
  
    
  
  
    
    
  
  
    
    
    
    
  
  
  
  
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
    
  
  
  
    
    
    
  
  
    
    
    
    
  
  
    
    
    
  
  
  
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
    
    
  
  
  
  
  
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
  
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
    
    
  
  
    
  
  
    
    
    
  
  
  
    
    
    
    
    
  
  
    
  
  
    
    
    
  
  
    
  
  
    
    
    
    
  
  
    
    
    
  
  
    
    
    
  
  
    
    
  
  
  
  
    
  
  
  
  
  
  
    
    
    
  
  
  
  
    
    
  
  
    
    
  
  
  
  
  
  
  
  
    
    
  
  
    
    
  
  
  
    
    
    
  
  
    
  
  
    
    
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
  
  
    
    
  
  
    
    
  
  
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
  
    
  
  
    
    
    
    
  
  
    
    
  
  
    
  
  
    
    
    
  
  
    
    
  
  
    
    
    
    
  
  
  
    
    
    
    
  
  
    
    
    
  
  
  
  
  
    
    
  
  
    
  
  
    
    
  
  
    
    
  
  
    
    
  
  
    
  
  
    
  
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
  
  
    
    
  
  
    
    
  
  
    
    
    
    
  
  
  
  
    
    
    
  
  
    
    
  
  
    
    
  
  
    
    
    
  
  
    
    
  
  
    
  
  
    
  
  
    
    
    
    
  
  
    
    
  
  
    
    
  
  
  
  
    
    
    
    
  
  
    
  
  
    
  
  
    
    
    
    
  
  
  
    
  
  
  
  
    
  
  
    
    
    
  
  
    
  
  
  
    
    
  
  
    
  
  
    
    
    
  
  
  
    
    
  
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
    
  
  
    
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  


我们可以看到基本上源码中的信息都可以在XML文件中找到,当然按照需求我们还得对xml文件中的信息进行提取。这就是另一个牛逼的工具pygccxml干的事情了,事实上这个工具也包含了gccxml的功能,而且更强大些。




你可能感兴趣的:(代码分析)