2012-11-20 86 views
1

我正在尋找與Windows'CommandLineToArgvW等效的函數。Linux上的CommandLineToArgvW等效項

我有一個字符串,我想分手正是慶典的方式做它,所有的角落的情況下 - 即考慮到單,雙引號,反斜槓,等等,所以分裂a b "c'd" "\"e\"f" "g\\" h 'i"j'會導致成:

a 
b 
c'd 
"e"f 
g\ 
h 
i"j 

由於這種功能已經存在,並使用由OS/bash中,我假設有一個方法來調用它,或者至少可以得到它的源代碼,所以我並不需要徹底改造車輪。

編輯

要回答爲什麼我需要它,它無關產卵子進程。我想製作一個搜索文本的程序,以任意順序觀察多個正則表達式爲真。但是所有的正則表達式都會被輸入到同一個文本字段中,所以我需要將它們分開。

+1

我想到的第一個想法是:你需要嗎?你在用什麼? –

+0

我正在嘗試製作一個文本搜索程序,您可以在同一個字段中輸入多個正則表達式。不是在單獨的框中輸入它們,而是一次輸入所有內容,但它們按照這些規則分解。由於反斜槓和特殊字符在正則表達式中很重要,我需要將它們考慮在內。 – sashoalm

+0

這可能不是處理多個正則表達式的最佳方法,因爲正則表達式通常包含空格和引號。我會困惑與正則表達式分析殼引用規則。也許你可以讓它們像許多語言一樣用斜線分隔,例如'/ foo bar。*// baz * /'。 –

回答

2

GNU/Linux由free softwarebash組成,是免費軟件,因此您可以獲取源代碼並對其進行改進(並且您應該在GPL許可下發布您的改進補丁)。

但是沒有這樣做的公共庫,因爲它的作用是將命令行擴展爲系統調用參數(然後轉到被調用程序的main)。

(這是不同的MS-DOS,在被調用的程序必須擴大它的命令行)

功能wordexp(3)靠近你可能想要的東西。

您可能想研究更簡單的shell的源代碼,例如下載sash-3.7.tar.gz

2

如果你想讓它按照Bash的方式擴展字符串,你需要運行Bash。請記住,Bash執行參數擴展,命令替換等。如果它真的需要像Bash一樣行動,就打電話給Bash吧。

FILE *f = popen("bash", "r+"); 
fprintf(f, "echo %s", your_string); 
fgets(buffer, sizeof(buffer), f); 
pclose(f); 

請注意,真正的代碼將需要處理錯誤,並可能分配一個更大的緩衝區,如果你的原始不夠大。

鑑於您的更新要求,這聽起來像你不想完全像Bash那樣解析它。相反,你只是想用空格分隔的字符串來引用和轉義。我會建議你自己簡單地實施這個;我不知道任何現成的庫會按照您指定的方式來解析字符串。你不必完全用手寫下它;您可以使用像flexRagel這樣的詞彙掃描生成器來達到此目的。

+0

我會嘗試,但是這種字符串解析通常有很多角落案例,這意味着很多潛在的錯誤。這就是爲什麼我想要使用經過驗證的代碼。 – sashoalm

+0

@satuon你不必完全手工完成。你可以使用解析器生成器。對於這個簡單的任務,狀態機生成器[Ragel](http://www.complang.org/ragel/)可能會運行良好。 –