系統程式設計師成長計畫 文字處理 INI解析器

2021-08-23 15:29:35 字數 1804 閱讀 2019

系統程式設計師成長計畫-文字處理(一)

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)

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;

}

ini檔案有幾個變種:

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 看來還是堅持了 函...