2017-12-09 20 views
1

나는 명령 줄 옵션을 구문 분석하는 내 C 프로그램에서 argp을 사용하고 싶습니다.GNU의 argp는 어떻게에만 긴 이름의 옵션을 구문 분석하는 방법?

하나의 요구 사항은 짧은 이름 (예 : -f bar)이 아니고 긴 이름 (예 : --foo=bar) 만 필요하다는 것입니다.

내 접근 방식은 지금까지 짧은 이름을 표시하지 수 있도록 0argp_option 구조체의 key 필드를 설정하는 것입니다.

자세한 내용은 the provided examples과 을 보았습니다 만, argp에 주어진 파서 기능에서만 긴 이름이있는 옵션을 구문 분석 할 수있는 방법을 찾을 수 없습니다.

내가 알아 않은 것은 이론적으로, 파서에 내가

case ARGP_KEY_ARG: 
    printf("%s\n", arg); 

긴 옵션의 (--foo=bar 호출 할 때, 예를 들어, bar 여기에 인쇄 될 것입니다)를 찾는 데 사용할 수 있다는 점이다. 그러나 실제로 어떤 옵션이 속하는지 간단하게 알려주지 않으므로 올바른 접근 방식이 아닌 것 같습니다. 실제 명령 행 인수 (옵션 값이 아님)도 표시됩니다.

은 내가 볼 필요가 위치에 대한 어떤 조언 감사 할 것입니다. 건배. "The GNU C Library: Argp Option Vectors — Specifying Options in an Argp Parser"에서

+0

'짧은'옵션으로 음수 (예 :'-1')를 사용하고 스위치에서 처리 할 수 ​​있습니다. – keltar

+1

옵션의'key' 필드는 임의의'int' 값이 될 수 있습니다. 문서에서는'isascii (key)'가 true이면'key'는 짧은 옵션'-char' ('char'는 문자 코드'key'와 연관된 문자)입니다. 기술적으로,'isascii'는'0x00 <= key && key <0x80'을 보장하므로, 그 범위를 벗어난 어떤 int 값도 키에 사용할 수 있습니다. 이'key '는 연관된 긴 옵션 (예 :'--foo')의 값으로 계속 사용되기 때문에 어떤 키/단축 옵션과도 동일하게 처리 할 수 ​​있습니다. BTW, 모든 옵션 키를 상수로'enum '에 담았습니다.'0x100'옵션이'switch'에서 무엇을 나타내는 지 궁금하지 않습니다 .-) –

+0

@ChronoKitsune 그 대답은 狐이 될 수 있습니다. Btw, 왜'-opt'를 키로 사용하지 않는지 (짧은 옵션이 될지도 모르는 * 음수 * 값). 예 : 's'와'd '가 의미있는 짧은 옵션 인 경우 절대 값이> 0x80 인'-s'와'-d '를 사용하십시오. –

답변

2

:

int key

옵션 파서 현재 옵션으로 제공하는 정수 key. key가 인쇄 가능한 ASCII 문자 인 값을 갖는 경우 (즉, 참 isascii (key))는 또한 char 코드 key와 ASCII 문자 축약 옵션 -char, 를 지정한다. 즉

는 옵션의 key 필드는 int 값이 될 수 있으며, isascii(key)이 0이 아닌 경우, 그것은 또한 당신이 범위 0x00으로 외부 (값을 ASCII가 아닌 값을 사용할 수 있습니다 의미 짧은 옵션 —를 지정합니다 ..0x7F) 짧은 옵션을 피하십시오. 짧은 옵션이 아니더라도 key 값은 연결된 긴 옵션 (예 : --foo)의 값으로 계속 사용되므로 키/짧은 옵션과 동일하게 처리 할 수 ​​있습니다.

O/T : enum의 모든 옵션 키를 상수로 수집하므로 어떤 옵션이 인 지 궁금하지 않습니다. 예 : switch. GNU tar을 위해, 그것의 압축 옵션을 이런 식으로 뭔가를 할 수 있습니다 옵션의 다음 세트는 다음 0x3000x200를 사용하는

그런 다음
enum compress_options { 
    // Archive file extension determines compression program 
    COMP_FILTER_AUTO = 'a', 
    // Option arg is program used to deal with compression 
    COMP_FILTER_ARG = 'I', 

    COMP_FILTER_BZIP2 = 'j', 
    COMP_FILTER_XZ = 'J', 
    COMP_FILTER_GZIP = 'z', 
    COMP_FILTER_COMPRESS = 'Z', 

    COMP_FILTER_LZIP = 0x100, 
    COMP_FILTER_LZMA, 
    COMP_FILTER_LZOP, 

    // Do not use archive suffix to determine compression program. 
    COMP_FILTER_NOAUTO, 
}; 

그냥 옵션을 갖는 문제를 방지하기 위해 등을 확인해야합니다 것 같은 가치. 당신이 필요한 경우, 당신은 또한 0x100, 0x180, 0x200, 0x280을, 등 (사용할 수 있습니다 예를 들어,0x100은 하위 명령을 나타낼 수 있으며 0x180이 해당 하위 명령의 첫 번째 옵션 일 수 있습니다.

짧은 옵션과 짧은 옵션을 따로 그룹화하는 것이 중요합니다. enum의 암시 적으로 할당 된 값은 마지막으로 명시 적으로 할당 된 값의 값에 따라 다릅니다. COMP_FILTER_AUTO 다음에 COMP_FILTER_NOAUTO을 배치했다면, --no-auto-compress 긴 옵션은 연결된 짧은 옵션 -b을 가지게되어 실제로는 그렇지 않습니다.

+0

감사합니다. 내 질문에 대한 답변입니다. 나는 그 범위를 벗어난 값을 사용하고 스위치 케이스에서 값을 비교할 수 있다고 생각하지 못했습니다. 나는 C 프로그래밍에서 이러한 정도의 "자유"(의미 론적 모호성)에 익숙하지 않다. – ngmir

+0

추가 메모를 보내 주셔서 감사합니다. 통찰력에 만족합니다. 나는이 사고도 통합했다. – ngmir