Click here to Skip to main content
Click here to Skip to main content

XGetopt - A Unix-compatible getopt() for MFC and Win32

By , 20 May 2003
 

Introduction

I have ported many apps (probably too many!) from Unix to Windows, and most of them need some command line processing. In Unix, standard method is to call getopt(), but there is no equivalent in Windows. I have gotten so used to getopt() that I like to use it even in new Windows apps - it has a clean interface that is very understandable and self-documenting.

XGetopt Demo

So here is my version of getopt() for Windows. Please note it does not have all features of latest GNU getopt() - the limitation are documented in source header. It is pretty much a drop-in replacement for any app already using getopt().

The demo project provides a sample app that shows how command line is processed. Press "Call getopt" button and getopt() will be invoked with command line you have entered.

      XGetopt screenshot

How To Use

To integrate XGetopt into your own app, you first need to add following files to your project:

  • XGetopt.cpp
  • XGetopt.h

Next, include header file XGetopt.h in dialog's .cpp file (if it is a dialog-based app) or your CWinApp .cpp, and create a ProcessCommandLine() function, like the one in the demo app. See XGetoptTestDlg.cpp for an example.

Revision History

Version 1.2 - 2003 May 17

  • Added Unicode support

Version 1.1 - 2002 March 10

  • Added example to XGetopt.cpp module header

Acknowledgments

The XGetopt demo uses code from Matt Pietrek's LIBCTINY library. The source code for LIBCTINY may be found here.

Usage

This software is released into the public domain. You are free to use it in any way you like. If you modify it or extend it, please consider posting the new code here for everyone to share. This software is provided "as is" with no expressed or implied warranty. I accept no liability for any damage or loss of business that this software may cause.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Hans Dietrich
Software Developer (Senior) Hans Dietrich Software
United States United States
Member
I attended St. Michael's College of the University of Toronto, with the intention of becoming a priest. A friend in the University's Computer Science Department got me interested in programming, and I have been hooked ever since.
 
Recently, I have moved to Los Angeles where I am doing consulting and development work.
 
For consulting and custom software development, please see www.hdsoft.org.






Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberJacques Abada16 Feb '12 - 6:53 
useful and cool
GeneralMy vote of 5memberrrarey6 Feb '12 - 14:42 
Exactly what's needed for a win project and in the public domain.
QuestionHelpfulmemberJim Chung6 Sep '11 - 22:39 
Just looking for a windows version getopt.
Thanks for your help.
GeneralBuggymemberchengiz524 Feb '09 - 11:12 
It does not clear state between loops. Thus,
 
while (...getopt...) { ... }
optind = 1
while (...getopt...) { ... }
 
will fail. I have to take away a star for that one. I had to write my own impl now, boo hoo :(
GeneralDecent job but *does not* pertain to standard in many ways [modified]memberchengiz524 Feb '09 - 8:56 
Problems wrt unix standard getopt:
1. optopt is not supported.
2. opterr is declared but not defined or used. The code behaves as if opterr is 0, ie. no error messages are written.
3. optind is supposed to be 1 before first call to getopt. Here it is 0. FWIW the doc does mention this. (*)
4. optind is not supposed to change for "together" options, as it is supposed to be the index of the next arg to be processed. For example, for "exec -ab" (both -a, -b are options), optind is supposed to be 1 after -a is processed; thus 1 before (from 3. above), 1 after. Here it is 0 before, 2 after.
 
I'm sorry, but standard compatibility is 80% of the work of such low level code. OTOH lack of it makes it a true MS getopt Smile | :)
 
(*) The reason optind is 1 is because argv starts to be processed at index optind, which works out well for command line args. At least I can use a 'standard' getopt for any set of such args (which dont have the 'program name' in front) by simply presetting optind to 0. With this implementation, I cannot do anything other than prefixing a dummy argument to my array.
 
modified on Tuesday, February 24, 2009 3:19 PM

GeneralNow available for C#mvpHans Dietrich8 Jun '07 - 13:59 
There is a new C# version of getopt here: http://www.codeproject.com/useritems/XGetoptCS.asp.
 

GeneralThanksmemberjimchung25 Feb '07 - 23:00 
U save us kinda lot of time.
I am just wondering why I can't find getopt from MSDN.
 
Thanks
 
Jim Chung
GeneralVery useful - Cheers!memberalcoholic_satan29 Jul '06 - 6:09 
As the title says - useful bit of code - cheers!
 
PC
GeneralThank you very muchsussAnonymous8 Aug '05 - 7:29 
thanks veryvery much,i cant find getopt() in .net 2003 but its OK now,thank U very much Smile | :)
but can i copy the soucecode from linux?
GeneralHelpUsing XGetoptmemberjames2003_james1 Aug '05 - 8:11 
I'm brand new to C programming. My first project involves converting an old Unix C program to Windows. Right now, I'm trying to make a simple program that uses XGetopt, but I
keep getting errors. I'm using Borland C++ 5.01
 
Here's the errors I'm getting:
Info :xgetopt.cpp: output file xgetopt.obj does not exist
Info :Compiling C:\Documents and Settings\epajn\Desktop\parser\getopt\test\xgetopt.cpp
Error: STDAFX.H(11,2):Unable to open include file 'afxwin.h'
Error: STDAFX.H(12,2):Unable to open include file 'afxext.h'
Error: STDAFX.H(13,2):Unable to open include file 'afxdtctl.h'
Error: STDAFX.H(15,2):Unable to open include file 'afxcmn.h'
Warn : XGETOPT.H(18,1):Redefinition of '_MT' is not identical
Error: XGETOPT.H(19,15):Declaration syntax error
Error: XGETOPT.H(21,29):Type name expected
Error: xgetopt.cpp(155,3):Declaration syntax error
Error: xgetopt.cpp(158,29):Type name expected
 
Any help would be greatly appreciated. Sorry for the ignorance
Generalgetopt() source code available on MSDNmemberZele27 May '03 - 7:01 
You can find getopt() source code on your MSDN Library Disc 2.
Just search for 'getopt' under the 'Search' tab. You will get GETOPT.C
and GETOPT.H in the search result. The source code is available by IBM Corporation on an AS IS basis, and I believe it works well.
 
Zele
GeneralRe: getopt() source code available on MSDNsussAnonymous18 Sep '03 - 22:44 
Can you tell me on which edition of MSDN CD can I find the
source code of getopt?
I searched it on MSDN April 2003.
-Amey
GeneralRe: getopt() source code available on MSDNmemberZele18 Sep '03 - 23:17 
It is in MSDN Library you've got with Visual Studio 6.0
GeneralBrilliantmemberDave J Smith21 Dec '02 - 11:34 
Thank you very much for striking out and writing this! It is much apreciated!
 
Dave
Generalnon option argumentsmemberexo13 Mar '02 - 5:49 
It would be nice if it supported non option arguments ANYWHERE in the command line, not only as the last one.
GeneralRe: non option argumentsmemberHans Dietrich13 Mar '02 - 7:23 
This is one of limitations listed in XGetopt.cpp header: " 5) The automatic permutation of arguments is not supported."
 
If you would like, please feel free to add this to XGetopt.
 
Best wishes,
Hans

GeneralThanks a lot ,Very good!memberjeasonzhao10 Mar '02 - 20:40 
Thanks!!;)
 
Please pardon my weak English!
GeneralVery good stuff :-)memberNish [BusterBoy]10 Mar '02 - 6:06 
Nish
 
Bow wow wow,
Yippee yo yippee yay,
My miniputt high,
Is now 30 yay.
GeneralQuick ideamemberGiles10 Mar '02 - 3:49 
Its probably a useful thing to give a quick descriptio of what GetOpt is fro people who don't know. I had to have a think, because I've not touched Unix in a couple of years, but could see that this is a really useful little tool one I reminded myself.
 
Good Stuff.
 
Thanks,

 
Giles
GeneralRe: Quick ideamemberGiles10 Mar '02 - 3:50 
Ignore that, I did not spot the section below the Title - would have made life easier for myself.
 
Laugh | :laugh:
 
Giles
GeneralRe: Quick ideamemberMatt Newman10 Mar '02 - 3:56 
Don't we all do that Smile | :)
 
-Suspicious | :suss: Matt NewmanSuspicious | :suss:
-Sonork ID: 100.11179:BestSnowman


GeneralRe: Quick ideamemberGiles10 Mar '02 - 4:29 
Yep, I can belive I'm not the only one who's done it.

 
Giles

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 21 May 2003
Article Copyright 2002 by Hans Dietrich
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid