nl:: ArgParser
摘要
列舉 |
|
---|---|
OptionArgumentType
|
列舉 定義指令列選項的引數需求。 |
Typedefs |
|
---|---|
NonOptionArgHandlerFunct)(const char *progName, int argc, char *argv[])
|
typedefbool(*
透過呼叫的函式,可用來處理任何其餘非選項的指令列引數。 |
OptionHandlerFunct)(const char *progName, OptionSet *optSet, int id, const char *name, const char *arg)
|
typedefbool(*
可呼叫的函式來處理一組指令列選項。 |
變數 |
|
---|---|
PrintArgError = DefaultPrintArgError)(const char *msg,...)
|
void(*
用於列印引數剖析期間錯誤的函式指標。
|
gActiveOptionSets = NULL
|
OptionSet **
傳遞至目前運作中 ParseArgs() 呼叫的 OptionSet 清單。
|
函式 |
|
---|---|
CountAllOptions(OptionSet *optSets[])
|
size_t
|
CountAllOptions(OptionSet **optSets)
|
size_t
|
CountOptionSets(OptionSet *optSets[])
|
size_t
|
CountOptionSets(OptionSet **optSets)
|
size_t
|
DefaultPrintArgError(const char *msg, ...)
|
void
列印與引數剖析相關的錯誤訊息。
|
FindOptionById(OptionSet **optSets, int optId, OptionSet *& optSet, OptionDef *& optDef)
|
void
|
FindOptionByIndex(OptionSet **optSets, int optIndex, OptionSet *& optSet, OptionDef *& optDef)
|
void
|
GetNextArg(char *& parsePoint)
|
bool
|
IsShortOptionChar(int ch)
|
bool
|
MakeLongOptions(OptionSet **optSets)
|
struct option *
|
MakeShortOptions(OptionSet **optSets)
|
char *
|
MakeUniqueHelpGroupNamesList(OptionSet *optSets[])
|
const char **
|
ParseArgs(const char *progName, int argc, char *argv[], OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown)
|
bool
剖析一組指令列樣式的引數,呼叫處理函式以處理每個選項和非選項引數。
|
ParseArgs(const char *progName, int argc, char *argv[], OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler)
|
bool
|
ParseArgs(const char *progName, int argc, char *argv[], OptionSet *optSets[])
|
bool
|
ParseArgsFromEnvVar(const char *progName, const char *varName, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown)
|
bool
從已命名的環境變數剖析一組引數。
|
ParseArgsFromEnvVar(const char *progName, const char *varName, OptionSet *optSets[])
|
bool
|
ParseArgsFromEnvVar(const char *progName, const char *varName, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler)
|
bool
|
ParseArgsFromString(const char *progName, const char *argStr, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown)
|
bool
從指定字串剖析一組引數。
|
ParseArgsFromString(const char *progName, const char *argStr, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler)
|
bool
|
ParseArgsFromString(const char *progName, const char *argStr, OptionSet *optSets[])
|
bool
|
ParseBoolean(const char *str, bool & output)
|
bool
將字串剖析為布林值。
|
ParseFabricId(const char *str, uint64_t & fabricId, bool allowReserved)
|
bool
剖析文字形式的 Weave 布料 ID。
|
ParseHexString(const char *hexStr, uint32_t strLen, uint8_t *outBuf, uint32_t outBufSize, uint32_t & outDataLen)
|
bool
剖析以十六進位格式提供的位元組字串。
|
ParseIPAddress(const char *str, IPAddress & output)
|
bool
以文字格式剖析 IP 位址。
|
ParseInt(const char *str, uint64_t & output, int base)
|
bool
剖析並嘗試將字串轉換為 64 位元無正負號整數,並根據基礎參數套用適當的解釋。
|
ParseInt(const char *str, uint32_t & output, int base)
|
bool
剖析並嘗試將字串轉換為 32 位元無正負號整數,並根據基礎參數套用適當的解釋。
|
ParseInt(const char *str, int32_t & output, int base)
|
bool
剖析並嘗試將字串轉換為 32 位元帶正負號整數,並根據基礎參數套用適當的解讀。
|
ParseInt(const char *str, uint64_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 64 位元無正負號整數,並根據基本參數套用適當的解釋。
|
ParseInt(const char *str, uint32_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 32 位元無正負號整數,並根據底數參數套用適當的解釋。
|
ParseInt(const char *str, int32_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 32 位元帶正負號整數,並根據基礎參數套用適當的解釋。
|
ParseInt(const char *str, uint16_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 16 位元無正負號整數,並根據基礎參數套用適當的解釋。
|
ParseInt(const char *str, int16_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 16 位元帶正負號整數,並根據基本參數套用適當的解釋。
|
ParseInt(const char *str, uint8_t & output)
|
bool
剖析並嘗試將解讀為十進位值的字串轉換為 8 位元無正負號整數,並根據基本參數套用適當的解釋。
|
ParseNodeId(const char *str, uint64_t & nodeId)
|
bool
剖析文字形式中的 Weave 節點 ID。
|
ParseSubnetId(const char *str, uint16_t & subnetId)
|
bool
剖析並嘗試將字串轉換為 16 位元無正負號的子網路 ID,將字串解讀為十六進位。
|
PrintOptionHelp(OptionSet *optSets[], FILE *s)
|
void
將指定選項清單的說明文字輸出至串流。
|
PutStringWithBlankLine(FILE *s, const char *str)
|
void
|
PutStringWithNewLine(FILE *s, const char *str)
|
void
|
SplitArgs(char *argStr, char **& argList, char *initialArg)
|
int32_t
|
類別 |
|
---|---|
nl:: |
處理資訊選項 (說明、版本) 的常見 OptionSet。 |
nl:: |
OptionSet 是處理常式是虛擬函式。 |
Structs |
|
---|---|
nl:: |
定義指令列選項。 |
nl:: |
定義一組邏輯相關和可重複使用的指令列選項。 |
列舉
OptionArgumentType
OptionArgumentType
定義指令列選項的引數需求。
Typedefs
NonOptionArgHandlerFunct
bool(* NonOptionArgHandlerFunct)(const char *progName, int argc, char *argv[])
透過呼叫的函式,可用來處理任何其餘非選項的指令列引數。
OptionHandlerFunct
bool(* OptionHandlerFunct)(const char *progName, OptionSet *optSet, int id, const char *name, const char *arg)
可呼叫的函式來處理一組指令列選項。
變數
PrintArgError
void(* PrintArgError)(const char *msg,...) = DefaultPrintArgError
用於列印引數剖析期間錯誤的函式指標。
應用程式應呼叫 PrintArgError(),回報選項和非選項引數處理函式中的錯誤,而非直接列印至 stdout/stderr。
預設為 DefaultPrintArgError()
函式的指標。
gActiveOptionSets
OptionSet ** gActiveOptionSets = NULL
傳遞至目前運作中 ParseArgs() 呼叫的 OptionSet 清單。
如果未呼叫 ParseArgs(),這個值會是 NULL。
函式
CountAllOptions
size_t CountAllOptions( OptionSet *optSets[] )
CountAllOptions
size_t CountAllOptions( OptionSet **optSets )
CountOptionSets
size_t CountOptionSets( OptionSet *optSets[] )
CountOptionSets
size_t CountOptionSets( OptionSet **optSets )
DefaultPrintArgError
void DefaultPrintArgError( const char *msg, ... )
列印與引數剖析相關的錯誤訊息。
用來輸出因引數剖析而產生的錯誤訊息。
詳細資料 | |||
---|---|---|---|
參數 |
|
應用程式應透過 PrintArgError 函式指標呼叫,而非直接呼叫此函式。
FindOptionById
void FindOptionById( OptionSet **optSets, int optId, OptionSet *& optSet, OptionDef *& optDef )
FindOptionByIndex
void FindOptionByIndex( OptionSet **optSets, int optIndex, OptionSet *& optSet, OptionDef *& optDef )
GetNextArg
bool GetNextArg( char *& parsePoint )
IsShortOptionChar
bool IsShortOptionChar( int ch )
MakeLongOptions
struct option * MakeLongOptions( OptionSet **optSets )
MakeShortOptions
char * MakeShortOptions( OptionSet **optSets )
MakeUniqueHelpGroupNamesList
const char ** MakeUniqueHelpGroupNamesList( OptionSet *optSets[] )
ParseArgs
bool ParseArgs( const char *progName, int argc, char *argv[], OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown )
剖析一組指令列樣式的引數,呼叫處理函式以處理每個選項和非選項引數。
ParseArgs() 使用引數 (argv
) 清單,並根據一組提供的選項定義剖析引數。這個函式支援長 (opt) 和短 (-o) 選項,並實作與 GNU getopt_long(3) 函式相同的選項語法。
詳細資料 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||||
傳回 |
如果成功剖析所有選項和非選項引數,則為
true ;如果系統無法辨識選項,或其中一個處理常式函式失敗 (亦即傳回 false),則為 false 。 |
選項定義會以 OptionSet 結構 (optSets
) 陣列的形式傳遞至 ParseArgs()。每個 OptionSet 都包含選項定義和處理常式函式的陣列。ParseArgs() 按指定順序處理選項引數,並為每個已辨識的選項呼叫各自的處理常式函式。剖析所有選項後,系統會呼叫一個獨立的非選項處理常式函式 (nonOptArgHandler
) 一次,以便處理任何剩餘的引數。
選項組合
OptionSet 包含一組選項定義,以及指向在遇到其中一個關聯選項時,將會呼叫的處理常式函式的指標。選項集也包含說明文字,用來說明每個選項的語法和用途 (請參閱下方的「選項說明」)。選項組合可用來建立可重複使用的相關選項集合。這有助於簡化維護多個接受類似選項 (例如測試應用程式) 的應用程式所需的工作。
定義 OptionSetsone 有兩種模式可以選擇初始化 OptionSet 結構體本身,例如做為靜態全域變數,或加入 OptionSetBase 子類別,並提供建構函式。後者會使用純虛擬 HandleOption()
函式,將選項處理作業委派給子類別。
OptionSet 清單會做為 NULL 結尾的指標陣列傳遞至 ParseArgs() 函式。E.g.:
static OptionSet gToolOptions = { HandleOption, // handler function gToolOptionDefs, // array of option definitions "GENERAL OPTIONS", // help group gToolOptionHelp // option help text }; static OptionSet *gOptionSets[] = { &gToolOptions, &gNetworkOptions, &gTestingOptions, &gHelpOptions, NULL }; int main(int argc, char *argv[]) { if (!ParseArgs("test-app", argc, argv, gOptionSets)) { ... } }
選項定義
選項是使用 OptionDef
結構定義。選項定義會整理成 OptionDef 元素的陣列,其中每個元素都包含:選項名稱、用來識別選項的整數 ID,以及選項是否預期/允許引數。選項陣列的結尾會透過 NULL Name 欄位發出信號。E.g.:
enum { kOpt_Listen = 1000, kOpt_Length, kOpt_Count, }; static OptionDef gToolOptionDefs[] = { // NAME REQUIRES/ALLOWS ARG? ID/SHORT OPTION CHAR // ============================================================ { "listen", kNoArgument, kOpt_Listen }, { "length", kArgumentRequired, kOpt_Length }, { "count", kArgumentRequired, kOpt_Count }, { "num", kArgumentRequired, kOpt_Count }, // alias for --count { "debug", kArgumentOptional, 'd' }, { "help", kNoArgument, 'h' }, { NULL } };
選項 ID
Option ID 會針對處理選項的程式碼指出相關選項 (OptionHandler 函式)。選項 ID 與顯示選項的 OptionSet 相關,因此可能可以在不同的 OptionSet 中重複使用 (請參閱下方的 SHORT OPTIONS)。常見的慣例是,選項編號的開頭是 1000,但是任何數字 >128 個可用可以使用不同選項名稱相同的選項 ID 建立別名選項。
簡短選項
與 getopt_long(3) 不同,ParseArgs() 不會使用單獨字串來指定短選項字元清單。反之,如果選項的 ID 值落在圖形 ASCII 字元的範圍內,就允許將該字元用做簡短選項。
ParseArgs() 規定所有 OptionSet 的簡短選項字元不得重複。因此,如果課程之間共用任何 OptionSet,則不建議使用短選項,因為最有可能發生碰撞。短選項字元可在單一 OptionSet 中重複使用,以便建立別名長選項名稱。
選項說明
每個 OptionSet 都包含 OptionHelp
字串,說明相關選項的用途和語法。PrintOptionHelp()
函式會使用這些字串產生選項使用情形資訊。
按照慣例,選項說明字串會包含語法範例,後接選項文字說明。如果選項有簡短版本或別名,則會優先提供,優先於主要全名。為保持一致性,語法行會以 2 個空格縮排,而說明行則會以 7 空格縮排。每個選項說明後面會有一個空白行,包括最後一個欄位。
E.g.:
static const char *const gToolOptionHelp = " --listen\n" " Listen and respond to requests sent from another node.\n" "\n" " --length\n" " Send requests with the specified number of bytes in the payload.\n" "\n" " --num, --count \n" " Send the specified number of requests and exit.\n" "\n" " -d, --debug [ ]\n" " Set debug logging to the given level. (Default: 1)\n" "\n" " -h, --help\n" " Print help information.\n" "\n";
選項說明群組
OptionSet 包含 HelpGroupName
字串,可在說明輸出內容中將選項分組。PrintOptionHelp()
函式會在產生的用法輸出內容中,使用 HelpGroupName 做為區段標題。如果多個 OptionSet 使用相同的 HelpGroupName,則 PrintOptionHelp() 會在共同區段標題下方,列印不同的 OptionSet 選項說明。
ParseArgs
bool ParseArgs( const char *progName, int argc, char *argv[], OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler )
ParseArgs
bool ParseArgs( const char *progName, int argc, char *argv[], OptionSet *optSets[] )
ParseArgsFromEnvVar
bool ParseArgsFromEnvVar( const char *progName, const char *varName, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown )
從已命名的環境變數剖析一組引數。
ParseArgsFromEnvVar() 會讀取已命名的環境變數,並將值傳送至 ParseArgsFromString()
進行剖析。如未設定環境變數,則函式不會執行任何動作。
詳細資料 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||
傳回 |
如果成功剖析所有選項和非選項引數,或是未設定指定的環境變數,則為
true ;如果其中一個處理常式函式失敗 (亦即傳回 false),或發生內部錯誤,則傳回 false 。 |
ParseArgsFromEnvVar
bool ParseArgsFromEnvVar( const char *progName, const char *varName, OptionSet *optSets[] )
ParseArgsFromEnvVar
bool ParseArgsFromEnvVar( const char *progName, const char *varName, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler )
ParseArgsFromString
bool ParseArgsFromString( const char *progName, const char *argStr, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler, bool ignoreUnknown )
從指定字串剖析一組引數。
ParseArgsFromString() 將指定字串 (argStr
) 分割成一組引數,並使用 ParseArgs() 函式剖析引數。
詳細資料 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||
傳回 |
如果成功剖析所有選項和非選項引數,則為
true ;如果其中一個處理常式函式失敗 (亦即傳回 false),或發生內部錯誤,則傳回 false 。 |
輸入字串的語法與 Unix 殼層指令語法類似,但具有簡化的引用配置。詳細說明:
- 除非空格遭到引號或逸出,否則引數會以空白字元分隔。
- 反斜線會逸出下列字元,導致系統將其視為一般字元。反斜線本身就已經去除。
- 子字串的單引號或雙引號。子字串中唯一的特殊字元是反斜線,此字元會逸出下一個字元和對應的結尾引號。系統會移除開始/結束引號字元。
E.g.:
--listen --count 10 --sw-version '1.0 (DEVELOPMENT)' "--hostname=nest.com"
ParseArgsFromString
bool ParseArgsFromString( const char *progName, const char *argStr, OptionSet *optSets[], NonOptionArgHandlerFunct nonOptArgHandler )
ParseArgsFromString
bool ParseArgsFromString( const char *progName, const char *argStr, OptionSet *optSets[] )
ParseBoolean
bool ParseBoolean( const char *str, bool & output )
將字串剖析為布林值。
這個函式接受下列輸入值 (不區分大小寫):「true」、「yes」、「t」、「y」、「1」、「false」、「no」、「f」、「n」、「0」。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseFabricId
bool ParseFabricId( const char *str, uint64_t & fabricId, bool allowReserved )
剖析文字形式的 Weave 布料 ID。
ParseFabricId() 函式接受以十六進位格式指定的 64 位元架構 ID (開頭或不包含開頭的「0x」)。
詳細資料 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
如果值已成功剖析,則傳回 true;否則為 false。
|
ParseHexString
bool ParseHexString( const char *hexStr, uint32_t strLen, uint8_t *outBuf, uint32_t outBufSize, uint32_t & outDataLen )
剖析以十六進位格式提供的位元組字串。
ParseHexString() 會預期輸入內容採用十六進位數字的組合形式 (大寫或小寫)。您可以選擇使用下列任一字元 (冒號、分號、逗號、句號或破折號) 分隔十六進位組合。此外,系統會忽略輸入字串中任何一處的空白字元。
詳細資料 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
參數 |
|
||||||||||
傳回 |
如果值已成功剖析,則傳回 true;如果輸入資料格式錯誤,或
outBuf 太小,則為「false」。 |
ParseIPAddress
bool ParseIPAddress( const char *str, IPAddress & output )
以文字格式剖析 IP 位址。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
如果值已成功剖析,則傳回 true;否則為 false。
|
ParseInt
bool ParseInt( const char *str, uint64_t & output, int base )
剖析並嘗試將字串轉換為 64 位元無正負號整數,並根據基礎參數套用適當的解釋。
詳細資料 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint32_t & output, int base )
剖析並嘗試將字串轉換為 32 位元無正負號整數,並根據基礎參數套用適當的解釋。
詳細資料 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, int32_t & output, int base )
剖析並嘗試將字串轉換為 32 位元帶正負號整數,並根據基礎參數套用適當的解讀。
詳細資料 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint64_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 64 位元無正負號整數,並根據基本參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint32_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 32 位元無正負號整數,並根據底數參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, int32_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 32 位元帶正負號整數,並根據基礎參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint16_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 16 位元無正負號整數,並根據基礎參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, int16_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 16 位元帶正負號整數,並根據基本參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint8_t & output )
剖析並嘗試將解讀為十進位值的字串轉換為 8 位元無正負號整數,並根據基本參數套用適當的解釋。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
ParseNodeId
bool ParseNodeId( const char *str, uint64_t & nodeId )
剖析文字形式中的 Weave 節點 ID。
ParseNodeId() 函式可接受以十六進位格式指定 (無論是否開頭「0x」) 的 64 位元節點 ID,或是「any」字詞或「all」系統會解讀為任何節點 ID (0xFFFFFFFFFFFFFFFF)
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
如果值已成功剖析,則傳回 true;否則為 false。
|
ParseSubnetId
bool ParseSubnetId( const char *str, uint16_t & subnetId )
剖析並嘗試將字串轉換為 16 位元無正負號的子網路 ID,將字串解讀為十六進位。
詳細資料 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
是的;否則傳回 false。
|
PrintOptionHelp
void PrintOptionHelp( OptionSet *optSets[], FILE *s )
PutStringWithBlankLine
void PutStringWithBlankLine( FILE *s, const char *str )
PutStringWithNewLine
void PutStringWithNewLine( FILE *s, const char *str )
SplitArgs
int32_t SplitArgs( char *argStr, char **& argList, char *initialArg )