2010-06-01 23 views
10

Tengo una aplicación construida con el compilador MinGW C++ que funciona algo así como grep - acommand ve algo como esto:englobamiento con MinGW en Windows

myapp -e '.*' *.txt 

donde lo que viene después de la opción -e es una expresión regular , y la cosa después de eso es el patrón de nombre de archivo. Parece que MinGW expande automáticamente (globs en términos UNIX) la línea de comando para que mi expresión regular se destroce. Puedo desactivar este comportamiento, descubrí, estableciendo la variable global _CRT_glob en cero. Esto estará bien para bash y otros usuarios de shell sensibles, ya que el shell expandirá el patrón de archivos. Para los usuarios de MS cmd.exe, sin embargo, parece que tendré que expandir el patrón de archivo.

Así que mi pregunta: ¿Alguien sabe de una biblioteca globbing (o instalación en MinGW) para hacer parcial expansión de línea de comandos? Conozco la característica _setargv de Windows CRT, pero eso amplía la línea de comando completa. Tenga en cuenta que he visto this question, pero realmente no aborda la expansión parcial.

Terminé usando la compilación condicional para escribir mi propio código globbing para la versión de Windows de mi aplicación. Esto fue bastante fácil ya que tengo mi propia clase CommandLine que encapsula argc y argv de main(). Aún así, estaría interesado en escuchar otras soluciones.

+1

Extraño, poner comillas alrededor de tu expresión regular debería evitar el comportamiento de globbing. –

+0

@Brian Impide que el caparazón se incruste en el caparazón (por ejemplo, bash), pero bash quita las comillas y las pasa a mi aplicación, que luego realiza otra ronda de engomado. –

+1

Supongo que no sigo entonces. Si su aplicación obtiene '. *' En argc/argv, ¿cuál es el problema? –

Respuesta

2

<glob.h> tiene glob y globfree y muchos indicadores para glob.

+4

No forma parte de MinGW, desafortunadamente. –

+1

Parece que glob.h es parte de MinGW ahora. – Qix

0

No estoy seguro si entiendo completamente su problema aquí, pero en Windows debería poder usar las funciones FindFirstFile/FindNextFile de la API de WIN32. Honestamente, no sé si su capacidad de globalling es comparable a glob() pero podrías intentarlo