2015-07-03 13 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

/* Search and Print all non-duplicate struct names inside input file */ 
int main(int argc, char *argv[]) 
{ 
     char temp[64], buf[64], filename[128], array[1024] = ""; 
     char *ptr, *line = NULL; 
     char *tmp1, *tmp2; 
     ssize_t rv; 
     size_t len; 
     int count = 0; 
     FILE *fp; 

     if (argc < 2) { 
       printf("enter file name at cmd line...\n"); 
       return -1; 
     } 

     sprintf(filename, argv[1], strlen(argv[1])); 
     fp = fopen(argv[1], "r"); 
     if (!fp) { 
       printf("File could not be opened: %s\n", argv[1]); 
       return -1; 
     } 

     while ((rv = getline(&line, &len, fp)) != -1) { 
       ptr = strstr(line, "struct"); 
       if (ptr) { 
         ptr += strlen("struct"); 

         while (*ptr == ' ') 
           ptr++; 

         tmp1 = strchr(ptr, ' '); 
         tmp2 = strchr(ptr, ';'); 
         len = 0; 

         if (tmp1 == NULL && tmp2 == NULL) { 
           continue; 
         } 
         else if (tmp1 == NULL && tmp2 != NULL) { 
           len = tmp2 - ptr; 
         } 
         else if (tmp1 != NULL && tmp2 == NULL) { 
           len = tmp1 - ptr; 
         } 
         else if (tmp1 && tmp2) { 
           len = tmp1 < tmp2 ? tmp1 - ptr : tmp2 - ptr; 
         } 

         if (len) { 
           snprintf(temp, len+1, "%s", ptr); 

           if (!strstr(array, temp)) { 
             sprintf(buf, "%2d. ", count++); 
             strcat(buf, temp); 
             strcat(array, buf); 
             strcat(array, "\n"); 
           } 
         } 
       } 
     } 

     fclose(fp); 
     if (line) 
       free(line); 
     printf("%s\n", array); 
     return 0; 
} 

上述程序認定struct名稱正確,但是我看到像,)字符在輸出名稱的末尾。如何刪除它?下面是示例輸出:線的搜索和打印輸入文件中的所有非重複的結構名稱

[[email protected] programs]# ./a.out /usr/src/linux/drivers/net/ethernet/smsc/smsc911x.c 
0. smsc911x_data 
1. smsc911x_ops 
2. smsc911x_platform_config 
3. phy_device 
4. mii_bus 
5. net_device 
6. napi_struct 
7. regulator_bulk_data 
8. clk 
9. platform_device 
10. smsc911x_data, 
11. sk_buff 
12. net_device_stats 
13. netdev_hw_addr 
14. sockaddr 
15. ethtool_drvinfo 
16. ethtool_eeprom 
17. ethtool_ops 
18. net_device_ops 
19. ures, 
20. resource 
21. device_node 
22. smsc911x_data)) 
23. dev_pm_ops 
24. of_device_id 
25. platform_driver 

通知輸出10和22的一種方法將是爲,);和strchr做,並從端部除去炭。但是,如果非字母字符的數量增加,這不是一個乾淨的解決方案。

注:我發現這一點的最好的解決辦法是here

+0

你也應該考慮樣病例:爲pre-processed文件hworld.i上述程序的輸出;','結構名稱{};'結構名* PTR',結構{};' –

+0

也許更容易跳過,在找到「struct」之後,所有空格字符。如果下一個字符是「isalpha」或「_」,則將其作爲結構的名稱,並將所有字母數字字符作爲後續名稱。 –

+0

@DanielJour:感謝您的輸入,我修改了正確打印所有案例的程序。我也有要求解析所有預處理文件的結構名稱'file.i' –

回答

0

感謝來自Daniel Jour輸入以下代碼處理的struct name* ptr;struct name{ };所有的情況下,struct { };

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 

/* Search and Print all non-duplicate struct names inside input file */ 
int main(int argc, char *argv[]) 
{ 
     char temp[64], buf[64], filename[128], array[1024] = ""; 
     char *ptr, *line = NULL; 
     size_t len; 
     int count = 0, flag = 0; 
     FILE *fp; 

     if (argc < 2) { 
       printf("enter file name at cmd line...\n"); 
       return EXIT_FAILURE; 
     } 

     sprintf(filename, argv[1], strlen(argv[1])); 
     fp = fopen(argv[1], "r"); 
     if (!fp) { 
       printf("File could not be opened: %s\n", argv[1]); 
       return EXIT_FAILURE; 
     } 

     while ((getline(&line, &len, fp)) != -1) { 
       ptr = flag ? line : strstr(line, "struct "); 
       if (ptr) { 
         if (!flag) 
           ptr += strlen("struct "); 
         while (*ptr == ' ') 
           ptr++; 

         len = 0; 
         while (isalnum(*ptr) || *ptr == '_' || *ptr == '{' || *ptr == '}') { 
           if (*ptr == '{') { 
             flag++; 
           } 
           else if (*ptr == '}') { 
             len = 0; 
             flag--; 
             do { 
               ptr++; 
             } while (*ptr == ' '); 
             ptr--; 
           } 
           else if ((*ptr != '{') || (*ptr != '}')) { 
             len++; 
           } 
           ptr++; 
         } 

         if (len && !flag) { 
           ptr -= len; 
           snprintf(temp, len+1, "%s", ptr); 

           if (!strstr(array, temp)) { 
             sprintf(buf, "%2d. ", count++); 
             strcat(buf, temp); 
             strcat(array, buf); 
             strcat(array, "\n"); 
           } 
         } 
       } 
     } 

     fclose(fp); 
     if (line) 
       free(line); 
     printf("%s\n", array); 
     return EXIT_SUCCESS; 
} 

此程序不處理情況下,像func(struct x, struct y),感興趣的用戶可以修復它,或只是使用grep -o "struct [^ ;,)]\+" # | awk '{print $2}' | sort -u

[[email protected]]# cat hworld.c 
#include <stdio.h> 

int main() 
{ 
     printf("hello world\n"); 
     return 0; 
} 

[[email protected]]# gcc -Wall --save-temps hworld.c 
[[email protected]]# ./find_structs hworld.i 
0. _IO_FILE 
1. _IO_marker 
2. _IO_FILE_plus 
+0

第20行的'sprintf()'不應該是'strncpy()'什麼的? – lcd047

相關問題