cvsuser 03/07/02 09:39:18
Modified: include/parrot longopt.h
languages/imcc main.c
. longopt.c
Log:
longopt optional argument by Luke Palmer - many thanks
Revision Changes Path
1.4 +3 -2 parrot/include/parrot/longopt.h
Index: longopt.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/longopt.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -r1.3 -r1.4
--- longopt.h 21 May 2003 18:22:12 -0000 1.3
+++ longopt.h 2 Jul 2003 16:39:14 -0000 1.4
@@ -1,7 +1,7 @@
/* longopt.h
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: longopt.h,v 1.3 2003/05/21 18:22:12 scog Exp $
+ * $Id: longopt.h,v 1.4 2003/07/02 16:39:14 leo Exp $
* Overview:
* Command line option parsing (for pre-initialized code)
* Data Structure and Algorithms:
@@ -20,7 +20,8 @@
typedef const char* longopt_string_t;
typedef enum {
- OPTION_required_FLAG = 0x1
+ OPTION_required_FLAG = 0x1,
+ OPTION_optional_FLAG = 0x2
} OPTION_flags;
struct longopt_opt_decl {
1.29 +20 -10 parrot/languages/imcc/main.c
Index: main.c
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/main.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -w -r1.28 -r1.29
--- main.c 2 Jul 2003 08:29:18 -0000 1.28
+++ main.c 2 Jul 2003 16:39:17 -0000 1.29
@@ -29,13 +29,13 @@
static void usage(FILE* fp)
{
fprintf(fp,
- "imcc -[abcgGhjpPrStvVwy.] [-d FLAGS] [-o FILE] [-O level] <file>\n");
+ "parrot -[abcgGhjpPrStvVwy.] [-d [FLAGS]] [-O [level]] [-o FILE] <file>\n");
}
static void help(void)
{
printf(
- "imcc [Options] <file>\n"
+ "parrot [Options] <file>\n"
" Options:\n"
" -h --help\n"
" -V --version\n"
@@ -47,7 +47,7 @@
" -S --switched-core\n"
" -g --no-computed-goto\n"
" -t --trace\n"
- " -d --debug=HEXFLAGS\n"
+ " -d --debug[=HEXFLAGS]\n"
" -w --warnings\n"
" -G --no-gc\n"
" --gc-debug\n"
@@ -55,7 +55,7 @@
" <Compiler options>\n"
" -v --verbose\n"
" -o --output=FILE\n"
- " -O --optimize=LEVEL\n"
+ " -O --optimize[=LEVEL]\n"
" -a --pasm\n"
" -c --pbc\n"
" -r --run-pbc\n"
@@ -95,7 +95,7 @@
{ 'S', 'S', 0, { "--switched-core" } },
{ 'g', 'g', 0, { "--no-computed-goto" } },
{ 't', 't', 0, { "--trace" } },
- { 'd', 'd', OPTION_required_FLAG, { "--debug" } },
+ { 'd', 'd', OPTION_optional_FLAG, { "--debug" } },
{ 'w', 'w', 0, { "--warnings" } },
{ 'G', 'G', 0, { "--no-gc" } },
{ '.', '.', 0, { "--wait" } },
@@ -107,7 +107,7 @@
{ 'v', 'v', 0, { "--verbose" } },
{ 'y', 'y', 0, { "--yydebug" } },
{ 'o', 'o', OPTION_required_FLAG, { "--output" } },
- { 'O', 'O', OPTION_required_FLAG, { "--optimize" } },
+ { 'O', 'O', OPTION_optional_FLAG, { "--optimize" } },
{ '\0', OPT_GC_DEBUG, 0, { "--gc-debug" } },
{'\0', OPT_DESTROY_FLAG, 0, { "--leak_test", "--destroy-at-end" } },
{ 0, 0, 0, { NULL } }
@@ -153,8 +153,12 @@
setopt(PARROT_TRACE_FLAG);
break;
case 'd':
- IMCC_DEBUG++;
+ if (opt.opt_arg) {
IMCC_DEBUG = strtoul(opt.opt_arg, 0, 16);
+ }
+ else {
+ IMCC_DEBUG++;
+ }
if (IMCC_DEBUG & 1)
setopt(PARROT_DEBUG_FLAG);
break;
@@ -197,8 +201,13 @@
break;
case 'O':
+ if (opt.opt_arg) {
strncpy(optimizer_opt, opt.opt_arg, sizeof(optimizer_opt));
optimizer_opt[sizeof(optimizer_opt)-1] = '\0';
+ }
+ else {
+ strcpy(optimizer_opt, "1");
+ }
if (strchr(optimizer_opt, '1'))
optimizer_level |= OPT_PRE;
if (strchr(optimizer_opt, '2'))
@@ -231,6 +240,7 @@
}
}
if (status == -1) {
+ fprintf(stderr, "%s\n", opt.opt_error);
usage(stderr);
exit(EX_USAGE);
}
1.5 +67 -20 parrot/longopt.c
Index: longopt.c
===================================================================
RCS file: /cvs/public/parrot/longopt.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- longopt.c 27 May 2003 02:27:50 -0000 1.4
+++ longopt.c 2 Jul 2003 16:39:18 -0000 1.5
@@ -1,7 +1,7 @@
/* longopt.c
* Copyright: (When this is determined...it will go here)
* CVS Info
- * $Id: longopt.c,v 1.4 2003/05/27 02:27:50 educated_foo Exp $
+ * $Id: longopt.c,v 1.5 2003/07/02 16:39:18 leo Exp $
* Overview:
* Data Structure and Algorithms:
* History:
@@ -95,15 +95,41 @@
/* XXX: (LP) if a longopt is given an argument when it's
* not expecting one, it is just ignored. Bad. */
- if (dptr->opt_flags & OPTION_required_FLAG) {
if (argv[dex][optlen] == '=') {
+ if (dptr->opt_flags & (OPTION_required_FLAG |
OPTION_optional_FLAG)) {
info_buf->opt_arg = &argv[dex][optlen+1];
}
else {
+ Parrot_snprintf(interp, longopt_error_buffer,
+ sizeof(longopt_error_buffer),
+ "Option %s does not expect an argument",
+ dptr->opt_long[sptr]);
+ info_buf->opt_error = longopt_error_buffer;
+ return -1;
+ }
+ }
+ else {
+ if (dptr->opt_flags & OPTION_required_FLAG) {
+ if (dex+1 < argc) {
+ info_buf->opt_arg = argv[dex+1];
+ ++info_buf->opt_index;
+ }
+ else {
+ Parrot_snprintf(interp, longopt_error_buffer,
+ sizeof(longopt_error_buffer),
+ "Option %s needs an argument",
+ dptr->opt_long[sptr]);
+ info_buf->opt_error = longopt_error_buffer;
+ return -1;
+ }
+ }
+ else if (dptr->opt_flags & OPTION_optional_FLAG) {
+ if (dex+1 < argc && argv[dex+1][0] && argv[dex+1][0] !=
'-') {
info_buf->opt_arg = argv[dex+1];
++info_buf->opt_index;
}
}
+ }
return dptr->opt_id;
}
@@ -148,6 +174,27 @@
info_buf->opt_arg = pos + 1;
}
else {
+ if (dex+1 < argc) {
+ info_buf->opt_arg = argv[dex+1];
+ ++info_buf->opt_index;
+ }
+ else {
+ Parrot_snprintf(interp, longopt_error_buffer,
+ sizeof(longopt_error_buffer),
+ "Option -%c expects an argument",
+ *pos);
+ info_buf->opt_error = longopt_error_buffer;
+ return -1;
+ }
+ }
+ info_buf->_shortopt_pos = NULL;
+ ++info_buf->opt_index;
+ }
+ else if (dptr->opt_flags & OPTION_optional_FLAG) {
+ if (*(pos + 1)) {
+ info_buf->opt_arg = pos + 1;
+ }
+ else if (dex+2 < argc && argv[dex+1][0] && argv[dex+1][0] != '-') {
info_buf->opt_arg = argv[dex+1];
++info_buf->opt_index;
}