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(*
可呼叫的函式,用於處理一組指令列選項。 |
Variables |
|
---|---|
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,其中處理常式是虛擬函式。 |
結構 |
|
---|---|
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)
可呼叫的函式,用於處理一組指令列選項。
Variables
PrintArgError
void(* PrintArgError)(const char *msg,...) = DefaultPrintArgError
用於輸出引數剖析期間發生的錯誤的函式指標。
應用程式應呼叫 PrintArgError(),以在選項和非選項引數處理函式中回報錯誤,而不是直接將錯誤傳送至 stdout/stderr。
預設為 DefaultPrintArgError()
函式的指標。
gActiveOptionSets
OptionSet ** gActiveOptionSets = NULL
傳送至目前有效 ParseArgs() 呼叫的 OptionSet 清單。
如果未呼叫 ParseArgs(),這個值會是空值。
函式
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「名稱」欄位發出信號。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
選項 ID 會找出處理選項的程式碼選項 (OptionHandler 函式)。選項 ID 相對於其出現的 OptionSet,因此可重複用於不同的 OptionSet (但請看下方的 SHORT OPTIONS)。常見的慣例是使用 1000 的編號選項 ID 開始編號,但可以使用任何大於 128 的數字。您可以使用相同的選項 ID 搭配不同的選項名稱來建立別名選項。
簡短選項
與 getopt_long(3) 不同的是,ParseArgs() 不會使用另一個字串來指定短選項字元清單。相反地,只要選項的 ID 值落在圖形 ASCII 字元範圍內,該字元就會成為簡短選項。
ParseArgs() 要求所有 OptionSet 中的簡短選項字元不得重複。因此,我們不建議對跨程式共用的 OptionSets 使用,因為這樣極有可能碰到衝突。短選項字元可在單一 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」。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 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 位元無正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint32_t & output, int base )
剖析並嘗試將字串轉換為 32 位元無正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, int32_t & output, int base )
剖析並嘗試將字串轉換為 32 位元帶正負號整數,根據底數參數套用適當的解釋。
詳細說明 | |||||||
---|---|---|---|---|---|---|---|
參數 |
|
||||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint64_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 64 位元無正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint32_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 32 位元無正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, int32_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 32 位元帶正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint16_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 16 位元無正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, int16_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 16 位元帶正負號整數,根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseInt
bool ParseInt( const char *str, uint8_t & output )
剖析並嘗試將解譯為十進位值的字串轉換為 8 位元無正負號整數,並根據基本參數套用適當的解釋。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 false。
|
ParseNodeId
bool ParseNodeId( const char *str, uint64_t & nodeId )
以文字格式剖析 Weave 節點 ID。
ParseNodeId() 函式接受以十六進位格式提供的 64 位元節點 ID (無論是否開頭的「0x」),或是「any」或「all」字詞,系統會將其解讀為「任何節點 ID」(0xFFFFFFFFFFFFFF)。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
如果成功剖析值,則為 true;如果不是,則為 false。
|
ParseSubnetId
bool ParseSubnetId( const char *str, uint16_t & subnetId )
剖析並嘗試將字串轉換為未簽署的 16 位元子網路 ID,並將字串解讀為十六進位。
詳細說明 | |||||
---|---|---|---|---|---|
參數 |
|
||||
傳回 |
成功時會傳回 true;否則,失敗時會傳回 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 )