diff options
-rw-r--r-- | nuttx/ChangeLog | 4 | ||||
-rw-r--r-- | nuttx/Documentation/NuttX.html | 5 | ||||
-rwxr-xr-x | nuttx/configs/demo9s12ne64/src/up_boot.c | 4 | ||||
-rwxr-xr-x | nuttx/drivers/lcd/nokia6100.c | 4 | ||||
-rw-r--r-- | nuttx/lib/lib_getopt.c | 65 |
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 <spudmonkey@racsa.co.cr> 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 <spudmonkey@racsa.co.cr> 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; } |