zebra分析版本:zebra-0.95a
命令儲存結構
對於上圖中略去的cmd_elemnt,它代表了一條命令,具體展開如下:
每條命令按上圖儲存,命令被分拆為tokens,儲存在vector中
如此,形成了zebra命令模式的基本框架:所有命令被分類到不同模式下。這裡的模式即上面圖中的
節點cmd_node,而命令則相當於cmd_element,可見,命令被放到了不同的node下。注意,上圖中的虛
箭頭並不代表鍊錶,只是代表元素的先後順序,實際上它們是以陣列儲存的。
zebra中命令的總結點(或根結點)是cmdvec,它包含了所有的cmd_node,而cmd_node包含了所有
的cmd_element。
初始化時首先載入所有的命令,形成上圖中的整體層次結構,然後對每個cmd_node下的命令執
行qsort,按命令的字元序重排,主要是為了查詢加速。
命令分析
命令的執行只要查詢cmdvec就可以了,下面著重於zebra命令的tab自動補齊,及列印所有可用命令
接收tab鍵,自動補齊命令,執行函式: vty_complete_command()
zebra的呼叫結構:
整個流程的主體是cmd_complete_command(),它呼叫了cmd_filter_by_completion()匹配已輸入字元 串,返回匹配結果,結果分為 了10種
no_match
extend_match
ipv4_prefix_match
ipv4_match
ipv6_prefix_match
ipv6_match
range_match
vararg_match
partly_match
exact_match
大部分是zebra支援的變數的匹配型別,partly_match表示只是部分匹配,exact_match表示乙個
token的完全匹配,no_match表示不 匹配,這三個狀態是我們所關心的。
例子: 輸入』configure』,輸入tab補齊,返回』configure(空格)』
輸入』configure(空格)』,輸入tab補齊,返回』configure(空格)terminal』
輸入』c』,輸入tab補齊,返回』co』
輸入』terminal(空格)』,輸入tab補齊,返回』terminal(空格)』 『length monitor no』
上面就是補齊的基本情況了(為了標註空格,上面的空格都以中文寫出)
1. 對於輸入的命令字串分拆成token後儲存為vector,程式中則是(以』configure ter』為例):
2. 假設vline有n個token,則對於vline的前n-1個token與每個命令的對應token比較,如果不是 exact_match,則返回
3. 對於vline的第n個token,匹配每個命令的第n個token前幾位是否為』ter』,並記錄下
所有匹配的token,生成匹配向量matchvec:
4. 結果回送給終端,在輸出完匹配結果後,再輸出乙個空格,即上例的實際輸出結果為:
『configure terminal 』(注意:最後多了個空格)
空格的作用:補上空格的意義在於,如果檢測輸入命令的最後乙個字元是空格,則在命令向
量vline最後補上』/0』,如輸入』configure 』,則生成vline如下圖:
在匹配vline的第二個token時,由於是空字元,所以它與所有的字元都相匹配,達到自動補齊下 乙個可選token的作用
接收?,顯示所有命令,執行函式: vty_describe_command()
不分析就得不到字段列表。一分析有感覺陷入分析的細節
一般般 276 855 11 09 52 我現在有個疑惑,就是字段列表中的資訊 屬性怎麼來,感覺不分析,就得不到字段列表。一分析有感覺陷入分析的細節,和介面混在一起了。潘加宇 3504847 11 15 18 乙個用例,該輸入什麼,輸出什麼,這是首先要和涉眾調研清楚的。例如 取款,輸入的是賬號,密碼...
需求分析 5 分析流程
1 小型流程 需求工作項 提交的文件 所處需求層次 業務目標 目標列表 業務需求 繪製用例圖 需求規約 或 用例模型 使用者需求 編寫用例規約 行為需求 2 中型流程 需求工作項 提交的文件 所處需求層次 業務目標 願景文件 業務需求 範圍 feature 上下文圖 繪製用例圖 需求規約 或 用例模...
1042 字元統計 20分 測試點一分析
測試點一分析 只有乙個字母,所以maxen初始要設定成最大的字母即是 z 不要設成第乙個字元,因為很有可能第乙個字元不是字母 測試點一 只有乙個字母,所以maxen初始要設定成最大的字母即是 z 不要設成第乙個字元,因為很有可能第乙個字元不是字母 include intmain gets str i...