summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-02-23 02:08:33 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-02-23 02:08:33 +0000
commit086efc834d511d771a996f895c73d35ca020b1d6 (patch)
tree4fa23d1c64b056046a4bc1f67a4f5ac2af908588
parentdbf4ba6371fc539eb768eb59f112982db9a0a0c2 (diff)
downloadpx4-nuttx-086efc834d511d771a996f895c73d35ca020b1d6.tar.gz
px4-nuttx-086efc834d511d771a996f895c73d35ca020b1d6.tar.bz2
px4-nuttx-086efc834d511d771a996f895c73d35ca020b1d6.zip
Fix getopt bug
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3310 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/ChangeLog4
-rw-r--r--nuttx/Documentation/NuttX.html5
-rwxr-xr-xnuttx/configs/demo9s12ne64/src/up_boot.c4
-rwxr-xr-xnuttx/drivers/lcd/nokia6100.c4
-rw-r--r--nuttx/lib/lib_getopt.c65
5 files changed, 50 insertions, 32 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index cdb664034..e3b2eb7bf 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -1463,5 +1463,9 @@
a USB host HID keyboard configuraion.
* drivers/usbhost/hid_parser.c -- Leverages the LUFA HID parser written by
Dean Camera.
+ * lib/lib_getopt() -- Correct an error in the getopt() logic: On certain error
+ return cases, the state was not being reset correcly and incorrect behaviors
+ could occur on subsequent calls to getopt().
+
diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html
index 5ce0d0b1a..58d886b3f 100644
--- a/nuttx/Documentation/NuttX.html
+++ b/nuttx/Documentation/NuttX.html
@@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
- <p>Last Updated: February 19, 2011</p>
+ <p>Last Updated: February 21, 2011</p>
</td>
</tr>
</table>
@@ -2040,6 +2040,9 @@ nuttx-5.18 2011-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
a USB host HID keyboard configuraion.
* drivers/usbhost/hid_parser.c -- Leverages the LUFA HID parser written by
Dean Camera.
+ * lib/lib_getopt() -- Correct an error in the getopt() logic: On certain error
+ return cases, the state was not being reset correcly and incorrect behaviors
+ could occur on subsequent calls to getopt().
pascal-2.1 2011-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
diff --git a/nuttx/configs/demo9s12ne64/src/up_boot.c b/nuttx/configs/demo9s12ne64/src/up_boot.c
index 18bf2b774..61313618a 100755
--- a/nuttx/configs/demo9s12ne64/src/up_boot.c
+++ b/nuttx/configs/demo9s12ne64/src/up_boot.c
@@ -2,7 +2,7 @@
* configs/demo9s12ne64/src/up_boot.c
* arch/arm/src/board/up_boot.c
*
- * Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -62,7 +62,7 @@
* Name: hcs12_boardinitialize
*
* Description:
- * All INCLUDE_HCS12_ARCH architectures must provide the following entry point. This entry point
+ * All HCS12 architectures must provide the following entry point. This entry point
* is called early in the intitialization -- after all memory has been configured
* and mapped but before any devices have been initialized.
*
diff --git a/nuttx/drivers/lcd/nokia6100.c b/nuttx/drivers/lcd/nokia6100.c
index e8cac7e96..d450e05db 100755
--- a/nuttx/drivers/lcd/nokia6100.c
+++ b/nuttx/drivers/lcd/nokia6100.c
@@ -2,7 +2,7 @@
* drivers/lcd/nokia6100.c
* Nokia 6100 LCD Display Driver
*
- * Copyright (C) 2010 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* References:
@@ -928,7 +928,7 @@ static int nokia_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffe
#if NOKIA_XBIAS > 0
col += NOKIA_XBIAS;
#endif
-#if NOKIA_XBIAS > 0
+#if NOKIA_YBIAS > 0
row += NOKIA_YBIAS;
#endif
DEBUGASSERT(buffer && col >=0 && (col + npixels) <= NOKIA_XRES && row >= 0 && row < NOKIA_YRES);
diff --git a/nuttx/lib/lib_getopt.c b/nuttx/lib/lib_getopt.c
index 31ba31f66..c75d1d7f5 100644
--- a/nuttx/lib/lib_getopt.c
+++ b/nuttx/lib/lib_getopt.c
@@ -1,7 +1,7 @@
/****************************************************************************
* lib/lib_getopt.c
*
- * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@@ -85,7 +85,7 @@ static bool g_binitialized = false;
* If there are no more option characters, getopt() returns -1. Then optind
* is the index in argv of the first argv-element that is not an option.
*
- * The 'optstring argument is a string containing the legitimate option
+ * The 'optstring' argument is a string containing the legitimate option
* characters. If such a character is followed by a colon, this indicates
* that the option requires an argument. If an argument is required for an
* option so getopt() places a pointer to the following text in the same
@@ -104,6 +104,19 @@ static bool g_binitialized = false;
* first character in optstring: if it is ':', then ':' is returned;
* otherwise '?' is returned.
*
+ * Assumptions:
+ * - getopt() uses global varialbles and, hence, can only be used on a single
+ * thread.
+ * - This version of getopt() implements a state machine with certain, strict
+ * rules. If these rules are not obeyed, the state machine will get out of
+ * sync and incorrect results will occur. The rules:
+ * 1. getopt() must be called repeatedly until a terminating value is
+ * returned. Terminating values include: {-1, ?, : }.
+ * 2. After a terminating value is returned, getopt() resets the global
+ * data and is ready for the next command line.
+ * 3. If the program chooses to violate rule #1, it may do so if it sets
+ * optind == -1.
+ *
****************************************************************************/
int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
@@ -162,9 +175,6 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* There are no more arguments, we are finished */
g_binitialized = false;
-
- /* Return -1 with optind == all of the arguments */
-
return ERROR;
}
@@ -176,38 +186,38 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
{
/* The argument does not start with '-', we are finished */
- g_optptr = NULL;
g_binitialized = false;
-
- /* Return the -1 with optind set to the non-option argument */
-
return ERROR;
}
/* Skip over the '-' */
g_optptr++;
- }
- /* Special case handling of "-" and "-:" */
+ /* Special case handling of "-" */
- if (!*g_optptr)
- {
- optopt = '\0'; /* We'll fix up g_optptr the next time we are called */
- return '?';
- }
+ if (!*g_optptr)
+ {
+ optopt = '\0';
+ g_binitialized = false;
+ return '?';
+ }
+ }
- /* Handle the case of "-:" */
+ /* Handle the case of ":" or '?' in the option list. We need to pick
+ * these off so that the return values cannot be confused with errors.
+ */
- if (*g_optptr == ':')
+ if (*g_optptr == ':' || *g_optptr == '?')
{
- optopt = ':';
- g_optptr++;
+ optopt = *g_optptr;
+ g_binitialized = false;
return '?';
}
- /* g_optptr now points at the next option and it is not something crazy.
- * check if the option is in the list of valid options.
+ /* g_optptr now points at the next option and it is not something crazy
+ * (like NULL or ? or :). Check if the option is in the list of valid
+ * options.
*/
optchar = strchr(optstring, *g_optptr);
@@ -216,7 +226,7 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* No this character is not in the list of valid options */
optopt = *g_optptr;
- g_optptr++;
+ g_binitialized = false;
return '?';
}
@@ -232,7 +242,9 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
return *optchar;
}
- /* Yes. Is the required argument after the command in this same argument? */
+ /* Yes... It has a required argument. Is the required argument after
+ * the command in this same argument?
+ */
if (g_optptr[1] != '\0')
{
@@ -258,12 +270,11 @@ int getopt(int argc, FAR char *const argv[], FAR const char *optstring)
/* No argument was supplied */
- optarg = NULL;
optopt = *optchar;
- optind++;
+ g_binitialized = false;
return noarg_ret;
}
- optind = 1;
+ g_binitialized = false;
return ERROR;
}