系統程式設計師成長計畫-文字處理(一)
sunday, june 07th, 2009 | author:
admin |
» edit «
作者****:李先靜
系統程式設計師成長計畫-文字處理(一)
狀態機(3)
o ini解析器
上面我們看了只有中間兩個狀態的狀態機,現在我們來看乙個稍微複雜一點的狀態機。
ini檔案是windows下常用的一種配置檔案。它由多個分組組成,每個組有多個配置項,每個配置項又由名稱和值組成。檔案裡還可以包含注釋,注釋通常以『;』(或『#』)開始,直到當前行結束。如xp下的win.ini:
第一行是注釋,後面有fonts、extensions和mci extensions三個空的分組,mci extensions.bak、annie和scicalc三個分組包含有乙個或多個配置項。
對於這樣乙個檔案,我們應該怎樣去解析它呢?按照前面的方法,先把資料讀入到乙個緩衝區中,讓乙個指標指向緩衝區的頭部,然後移動指標,直到指向緩衝區的尾部。在這個過程中,指標可能指向的注釋、分組的組名、配置項的名稱、配置項的值或者一些如換行符之類的格式資訊。
由此,我們可以這樣來定義ini的狀態機:
狀態集合:
1. 分組的組名狀態
2. 注釋狀態
3. 配置項的名稱狀態
4. 配置項的值狀態
5. 空白狀態
狀態轉換函式:
1. 初始狀態為「空白」狀態。
2. 在「空白」狀態下,讀入字元『[』,進入「分組組名」狀態。
3. 在「分組組名」狀態下,讀入字元『]』,分組組名解析成功,回到「空白」狀態。
4. 在「空白」狀態下,讀入字元『;』,進入「注釋」狀態。
5. 在「注釋」狀態下,讀入換行字元,結束「注釋」狀態,回到「空白」狀態。
6. 在「空白」狀態下,讀入非空白字元,進入「配置項的名稱」狀態。
7. 在「配置項的名稱」狀態下,讀入字元『=』, 配置項的名稱解析成功,進入「配置項的值」狀態。
8. 在「配置項的值」狀態下,讀入換行字元,配置項的值解析成功,回到「空白」狀態。
ini狀態機可以用下圖來表示:
現在我們來看看程式實現:
static void ini_parse (char* buffer, char comment_char, char delim_char)ini檔案有幾個變種:state = stat_none;
for(p = buffer; *p != '/0'; p++)
else if(*p == comment_char)
else if(!isspace(*p))
break;
}case stat_group:
break;
}case stat_comment:
break;
}case stat_key:
break;
}case stat_value:
break;
}default:break;}}
if(state == stat_value)
return;
}
1. 支援預設分組,如果只有乙個分組,省略分組的組名,linux下不少配置檔案採用這種方式。
2. 注釋符號,有的用『;』,有的用『#』,前者多用於windows下,後面多用於linux下。
3. 名稱和值之間的分隔,有的用空格,有的用『=』,有的『:』。
不管哪種格式,它們的解析方法是一樣的,在上面的程式中,我們使用了comment_char和 delim_char兩個引數,分別表示注釋符號和分隔符號。
系統程式設計師成長計畫 文字處理 INI解析器
系統程式設計師成長計畫 文字處理 一 sunday,june 07th,2009 author admin edit 作者 李先靜 系統程式設計師成長計畫 文字處理 一 狀態機 3 o ini解析器 上面我們看了只有中間兩個狀態的狀態機,現在我們來看乙個稍微複雜一點的狀態機。ini檔案是window...
系統程式設計師成長計畫 文字處理 一 狀態機 1
系統程式設計師成長計畫 文字處理 一 狀態機 1 sunday,june 07th,2009 author admin edit 作者 李先靜 系統程式設計師成長計畫 文字處理 一 狀態機 1 o 有窮狀態機的形式定義 有窮狀態機是乙個五元組 q,q0,f 其中 q是乙個有窮集合,稱為狀態集。是乙個...
系統程式設計師成長計畫005
1.這個變成大寫的函式,就不需要用函式指標來給foreach做引數了。因為他沒有什麼其他變種,不像print那樣,既要print int又要print str。函式指標,或者說 函式,別瞎用!2.書裡的寫法 dlist foreach dlist,str toupper,null 看來還是堅持了 函...