話說,
今天接到個任務
, 將公司的庫移植到
arm5
上(****,arm15
都有了,
你給哥整個
arm5….).一頓坑爹罵娘後
, 順利搞出
arm5
上的庫,
開始測試
, 然後
bus error(
還不是親切的
seqmenttation fault)
當然這篇部落格不是講bus error
的前因後果的
. 經過
各種排查
, 發現為此類**導致int n**** = *(int *)(****+42) (恩
,庫底層有很多這種讓人扯蛋的寫法
),但是這個庫在
arm7
和arm9,android和
windows
跑的都是很歡的
.(是的
,坑爹的
arm5
和指標強轉)
解決方案是memcpy,(
當然用結構體整體賦值那是最好的
,但是沒自動化測試工具的庫
,你是不敢動它的)
ok,之前都是吐槽
,問題來了
.這種指標強轉的寫法
, 分布之廣
,令人髮指
.且擺著各種姿勢在**深處等著
((int *) ,( int *) , (int*) ).
普通的查詢方法肯定是歇菜的
, 不過
sourceinsight
還是很牛的
,有正規表示式查詢方法
,於是我屁顛屁顛的就把\(\s*int\s*\*+\s*\)輸進去了,
結果「int *pclass, long omax)」這種貨色都給我匹配出來了(
小學沒畢業
, 不能這麼玩我吧
),各種測試
,感覺的
sourceinsight
自帶的正規表示式查詢方法跟我是尿不到乙個壺裡去了…
仔細想想,
這個正規表示式查詢方法實現起來其實蠻簡單的
,乙個遍歷目錄和檔案的遞迴方法
:iterdir , 對搜尋到的每個檔案
,呼叫方法
: searchfile,遍歷檔案裡的每一行
,對每一行呼叫方法
: checkline,判斷改行能否匹配使用者輸入的表示式
,如果匹配成功
, 呼叫方法:writelineinfo將結果寫入檔案.
於是,就寫了個
python指令碼,
**如下
:# -*- coding: gb2312 -*-
"""@author: vxpython
"""import os
import re
class searchclass(object):
def __init__(self , strpath = "" , strexpression=""):
super(self.__class__ , self).__init__()
self.stroutfilename = "result.log"
self.bskipnote = true
self.strpath = strpath
self.strexpression = strexpression
self.printinfo = none
self.initui()
#有時間用pyqt實現個gui介面
def initguiui(self):
pass
def initcuiprint(self , strinfo):
print strinfo
def initcuiui(self):
self.printinfo = self.initcuiprint
def initui(self):
self.initcuiui()
#遞迴遍歷目錄
def iterdir(self , path , depth):
#depth 遞迴深度
if os.path.isdir(path):
lipath = os.listdir(path)
nfilenum = len(lipath)
ncount = 1
for strchildpath in lipath:
strshow = "iter %s:process:%d / %d" % (path , ncount , nfilenum )
self.printinfo(strshow)
self.iterdir("/".join([path , strchildpath]) , depth+1)
os.system("cls") #linux "clear"
ncount += 1
elif os.path.isfile(path):
self.searchfile( path)
else :
self.printinfo('what **** file type...\n"%s" skip\n' % path )
def initwork(self):
self.strpath = raw_input("enter dir path==>")
self.strexpression = raw_input("enter expression==>")
self.printinfo('use "%s" in "%s"...\n' % (self.strexpression , self.strpath) )
try:
self.houtfile = open(self.stroutfilename , "w")
except exception , reason:
self.printinfo(reason)
def endwork(self):
try:
self.houtfile.close()
except exception , reason:
self.printinfo(reason)
self.printinfo("work over")
def runman(self):
while true:
self.initwork()
self.iterdir(self.strpath , 0)
self.endwork()
strres = raw_input("search again(y|y)==>")
if not strres.upper() == "y":
break;
#將使用者輸入的表示式開始匹配,是的,就是這麼簡單粗暴
def checkline(self , strline):
search = re.search(self.strexpression , strline)
if none == search : return false
else :
##跳過注釋行,其它語言的注釋自己看著辦,對於多行注釋暫時不實現了
if self.bskipnote:#看sourceinsight有這功能,實現個簡單的
match = re.match("\s*[/\*|//].*", strline)
if match != none:
return false
return true
def writelineinfo(self , strfilepath , strline , nlinecount):
try:
self.houtfile.write("%s:%d--%s" % (strfilepath , nlinecount , strline))
except exception , reason:
self.printinfo(reason)
def searchfile(self , strfilepath):
nlinecount = 0
with open(strfilepath , 'r') as hinfile:
for strline in hinfile:
nlinecount +=1
if self.checkline(strline):
self.writelineinfo(strfilepath , strline , nlinecount)
else:
pass
if __name__ == "__main__":
#clssearch = searchclass("d:\hello.txt" , "\(\s*int\s*\*+\s*\)")
clssearch = searchclass()
clssearch.runman()
然後, 繼續苦逼的跟bus error鬥爭吧... 正規表示式 火星文
之前在學習到正規表示式的時候,真的看了兩秒直接就跳過了,真的看到都怕,來自地球的我表示真的看不懂這個傳說中的火星文,但是,要想學習到更多的知識,我深知逃避是解決不了問題的,於是我硬著頭皮嘗試的去理解它,今天簡單記錄下來,以供以後來鄙視 正則表達是其實就是規則表示式,就是我們要找的條件翻譯成計算機能讀...
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
python正規表示式及使用正規表示式的例子
正規表示式 正則表達用來匹配字串 正規表示式匹配過程 正規表示式語法規則 匹配除換行 n 外的任意字串 abcabc 轉義字元,使後乙個字元改變原來的意思 a c a c 字符集,對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如 abc 或 a c 第乙個字元如果是 ...