Code archives/Miscellaneous/GetOpts
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This code is based on the unix shell version of getopts. This function offers a simple interface for parsing commandline parameters using named key/value pairs. Options may be supplied in any order and even combined. Supplying a token string like "i:o:hdtqe" will define the options your application supports. GetOpts will use it to look for options named i, o, h, d, t, q and e. The Options followed by ':' have to supply a value. For example: myapp.exe -h -dtq -e -i "myval" -o "and more value" As you can see the options 'dtq' are combined into a single entry. This is not required and can be done for all options. Just be sure to give any options which require a value, their own entry. A more compact and equally valid version of the above would be: myapp.exe -dqhtei "myval" -o "and more value" GetOpts does not ensure required parameters are present. This is up to you to verify. All options are case-sensitive. So -e is not the same as -E. GetOpts will report an error on a few occasions: - A user calls your program with an unrecognized option. Eg: it is not listed in the token string. - A user specifies an option that requires a value, but omits the value. Using it is simple:
superstrict
Framework brl.basic
Import brl.blitz
Include "getopts.bmx"
'// @opt will contain the name of the currently checked option.
'// @optarg will contain the value for this option (if any).
Local opt:String, optarg:String;
While(GetOpts("i:o:hdtqe", opt, optarg))
Select(opt)
Case "h"; PrintUsage(); end;
Case "i"; Print("option i: " + optarg);
Case "o"; Print("option o: " + optarg);
Case "d"; '...
Case "e"; '...
Case "q"; '...
Case "t"; '...
Default;
'// This will yield any values which are not
'// associated with any specific options.
'// eg: copy.exe -rq /path/to/source /path/to/dest
'// @opt will yield the 2 paths in this section.
print("unspecified option: " + opt);
End Select
Wend
'.. rest of your program
Known Issues: - Due to the way Blitz supplies us the Commandline options in AppArgs$[], it is problematic to provide an option value which is itself an option. Example: myapp.exe -c "-lGLU" This example will cause GetOpts() to throw an error "Missing value for option -c". The reason for this, is that AppArgs will list '-lGLU' without the quotes and this will result in '-lGLU' being considered a new and distinct option, instead of a value. This is a common problem for most GetOpts implementations, but there is a way around it. We can fix it by escaping the quotes around "-lGLU". For example: myapp.exe -c \"-lGLU\" Now GetOpts() will correctly recognize "-lGLU" as an option value. | |||||
Function GetOpts:Int(tokens:String, opt:String Var, optarg:String Var)
Global av:String[] = Null;
global isparsed:int = false;
If(not isparsed) Then
av = New String[0];
For Local n:Int = 1 Until AppArgs.Length
If(AppArgs[n][0..1] = "-") Then
For Local i:Int = 1 Until AppArgs[n].Length
av = av[..av.Length + 1];
av[av.length - 1] = "-" + AppArgs[n][i..i+1];
Next
Else
av = av[..av.Length + 1];
av[av.length - 1] = AppArgs[n];
End If
Next
isparsed = true;
End If
opt = ""; optarg = "";
If(av.Length = 0) Then Return False;
opt = av[0]; av = av[1..];
if(opt[0..1] <> "-") then return true;
Local idx:Int = tokens.Find(opt[1..]);
If(idx = -1) Then
WriteStdErr("Unrecognized option '" + opt + "' specified.~n");
end;
End If
If(idx < tokens.length - 1) Then
If(tokens[idx+1..idx+2] = ":") Then
If(av.length = 0 or av[0][0..1] = "-") Then
WriteStdErr("Missing value for option '" + opt + "'~n");
end;
End If
optarg = av[0]; av = av[1..];
End If
End If
opt = opt[1..];
Return True;
End Function |
Comments
| ||
| Can you still send a value without an option? Like the cp command. It is options then source and destination directory... |
| ||
| Excellent point. You can now :) I modified the entry and example code above accordingly. |
Code Archives Forum