2011-03-02 33 views
3

我最近收到了一些相對重要的功能,以補充某些我從某人處維護的軟件。不幸的是,他並沒有提供diff,而只是給了我他的整個源代碼樹,而且更糟糕的是,他似乎使用了某種代碼優化器,這種代碼優化器遠遠超出我以前使用或看到的任何東西,包括諸如獲取兩個重新格式化的C文件之間的差異

  • 插入和刪除行內各點的空格。
  • 將一些條件分解爲括號內的塊,將一些條件轉換爲單行條件,並將一些條件轉換爲換行符但不包含括號。
  • 將某些組合語句移到單獨的行中,並將一些單獨的語句組合成單行。
  • 在函數參數等位置插入和移除換行符。

運行在從他的版本的文件,縮進(BSD)和舊版本不帶他們彼此接近。使用astyle也不能很好地工作。無論哪種情況,仍然有不少格式化風格的殘餘。

是否有任何C格式化程序會基本上刪除儘可能多的格式,然後一致地格式化代碼?或者有什麼辦法讓格式化程序來做到這一點?它不需要看起來非常好,我只需要能夠得到一個合理的差異,以便我可以看到他實際上改變了什麼。

+7

你可以把它發回給他,並要求他遵守現有的格式標準? – kubi 2011-03-02 21:33:43

+0

或者獲取hin給兩個checkins原始代碼重新格式化爲他,然後更改 – Mark 2011-03-02 21:35:17

+0

作爲警告他人閱讀此內容,或者考慮重構他們稍後會在某處提交的代碼:事實證明,這對我們來說是最簡單的*完全重新執行*從頭開始的工作,完全無視他的貢獻,因爲要確切地發現他的版本中發生了什麼變化,實在太難了。 – cge 2015-02-28 05:07:58

回答

4

我會嘗試刪除與tr -s ' \t\r\n' ' '或等價物儘可能多的空格,然後將結果反饋到indent。 (不幸的是,不能這樣做tr -d,因爲那會損壞標記邊界。)

+0

這樣做的問題在於它不會處理預處理器指令或//註釋,但似乎處理這些操作的細微變化會起作用,我會嘗試。 – cge 2011-03-04 21:40:02

1

您可以預處理這兩個文件,然後對它們進行比較。

+0

我認爲這正是他所做的xD – fortran 2011-03-03 10:30:39

+0

不幸的是,像GNU cpp這樣的預處理器只處理宏,而不是重做格式化,除非我在某處丟失了一個選項。 – cge 2011-03-04 19:35:59

2

Netbeans和Eclipse C開發包附帶的重新格式化程序非常具有侵略性,也許您可​​以嘗試它們。

3

uncrustify是您可以嘗試的另一種選擇 - 極端可配置性有點壓倒性,但它能夠完成大部分(如果不是全部)您提到的事情。